117 lines
4.0 KiB
Swift
117 lines
4.0 KiB
Swift
//
|
||
// Constant.swift
|
||
// DLSDK
|
||
//
|
||
// Created by osell on 2023/3/6.
|
||
//
|
||
|
||
import Foundation
|
||
import SwiftyUserDefaults
|
||
|
||
/// NSUserDefaults 常量
|
||
extension DefaultsKeys {
|
||
/// 当前经纬度
|
||
var currentLatitude: DefaultsKey<Double?> { .init("currentLatitude") }
|
||
/// 是否自动更新位置
|
||
var updateLocationEnable: DefaultsKey<Bool> { .init("updateLocationEnable", defaultValue: true) }
|
||
/// 是否从第三方应用跳回
|
||
var isVendorCallback: DefaultsKey<Bool> { .init("isVendorCallback", defaultValue: false) }
|
||
/// 重新登录(IM需要获取id和签名)
|
||
var isReLogin: DefaultsKey<Bool> { .init("isReLogin", defaultValue: false) }
|
||
/// 显示引导页
|
||
var guideShowVersion: DefaultsKey<Int?> { .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)
|
||
}
|
||
}
|