// // Constant.swift // DLSDK // // Created by osell on 2023/3/6. // import Foundation import SwiftyUserDefaults /// NSUserDefaults 常量 extension DefaultsKeys { /// 当前经纬度 var currentLatitude: DefaultsKey { .init("currentLatitude") } var currentLongitude: DefaultsKey { .init("currentLongitude") } var currentPlacemark: DefaultsKey { .init("currentPlacemark") } var currentCity: DefaultsKey { .init("currentCity") } var currentAreaId: DefaultsKey { .init("currentAreaId", defaultValue: "") } var currentLevel: DefaultsKey { .init("currentLevel", defaultValue: "") } var searchLatitude: DefaultsKey { .init("searchLatitude") } var searchLongitude: DefaultsKey { .init("searchLongitude") } /// 是否自动更新位置 var updateLocationEnable: DefaultsKey { .init("updateLocationEnable", defaultValue: true) } /// 是否从第三方应用跳回 var isVendorCallback: DefaultsKey { .init("isVendorCallback", defaultValue: false) } /// 重新登录(IM需要获取id和签名) var isReLogin: DefaultsKey { .init("isReLogin", defaultValue: false) } /// 显示引导页 var guideShowVersion: DefaultsKey { .init("guideShowVersion") } } /// 通知常量 extension Notification.Name { /// 重新定位 static let LocationResetNotification = Notification.Name("LocationResetNotification") /// 定位更新通知 static let LocationDidUpdateNotification = Notification.Name("LocationDidUpdateNotification") /// 位置更换通知 static let LocationChangeNotification = Notification.Name("LocationChangeNotification") /// 更换城市通知 static let CityChangeNotification = Notification.Name("CityChangeNotification") /// 可滚动通知 static let IsScrollEnabledNotification = Notification.Name("IsScrollEnabledNotification") /// 查询订单支付状态 static let RequestOrderPayStatusNotification = Notification.Name("RequestOrderPayStatusNotification") /// 跳转物业缴费记录页面 static let PushRecordNotification = Notification.Name("PushRecordNotification") /// 显示弹窗 static let ShowAlertNotification = Notification.Name("ShowAlertNotification") } // MARK: - 普通常量 /// KeyWindow public var kKeyWindow: UIWindow? { UIApplication.keyWindow } /// KeyWindow安全区域 public var kSafeAreaInsets: UIEdgeInsets { kKeyWindow?.safeAreaInsets ?? .zero } /// 屏幕size public let kScreenSize = UIScreen.main.bounds.size /// 屏幕宽度 public let kScreenWidth = UIScreen.main.bounds.size.width /// 屏幕高度 public let kScreenHeight = UIScreen.main.bounds.size.height /// 状态栏高度 public var kStatusBarHeight: CGFloat { if #available(iOS 13.0, *) { let statusBarHeight = UIApplication.shared.windows .filter { $0.isKeyWindow } .first? .windowScene? .statusBarManager? .statusBarFrame .height ?? 0 return statusBarHeight } else { return UIApplication.shared.statusBarFrame.height } } /// 顶部导航+状态栏高度 public let kNaviHeight = 44 + kStatusBarHeight /// App显示名称 public let kAppName = Bundle.main.infoDictionary!["CFBundleDisplayName"] as! String //App 名称 /// App的Bundle版本 public let kAppVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String //App 版本 /// App的BundleShort版本 public let kAppShortVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String /// App的Identifier public let kBundleIdentifier = Bundle.main.infoDictionary!["CFBundleIdentifier"] as! String public let kIsFullScreen = kScreenHeight > 800 ? true : false public let kSafeBottomMargin: CGFloat = kIsFullScreen ? 34.0 : 0.0 /// 每页显示条数 public let kPageSize = 20 /// 同步锁 /// - Parameters: /// - lock: 加锁对象 /// - closure: 执行操作 public func synchronized(_ lock: Any, closure: () -> ()) { objc_sync_enter(lock) closure() objc_sync_exit(lock) } /// 主线程执行 /// - Parameter closure: 执行代码 public func MainAsync(_ closure: (() -> Void)?) { guard let closure = closure else { return } Thread.isMainThread ? closure() : DispatchQueue.main.async(execute: closure) } /// 全局队列 /// - Parameter closure: 执行代码 public func GlobalAsync(qos: DispatchQoS.QoSClass = .default, _ closure: (() -> Void)?) { guard let closure = closure else { return } Thread.isMultiThreaded() ? closure() : DispatchQueue.global(qos: qos).async(execute: closure) } extension DL { /// 安全字符串,不为nil public static func safeString(_ value: Any?) -> String { guard let value = value, !(value is NSNull) else { return "" } if let string = value as? String { return string } if let data = value as? Data { return String(data: data, encoding: .utf8) ?? "" } if let object = value as? NSObjectProtocol { return object.description } return String(describing: value) } /// 安全数字,不为nil public static func safeNumber(_ value: Any?) -> NSNumber { guard let value = value else { return NSNumber(value: 0) } if let number = value as? NSNumber { return number } return safeString(value).number ?? NSNumber(value: 0) } }