// // Constant.swift // DLSDK // // Created by osell on 2023/3/6. // import Foundation import SwiftyUserDefaults /// NSUserDefaults 常量 extension DefaultsKeys { /// 当前经纬度 var currentLatitude: DefaultsKey { .init("currentLatitude") } /// 是否自动更新位置 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 RefreshGroupInfoNotification = Notification.Name("RefreshGroupInfoNotification") } // 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) } }