Swift 扩展存储属性
Swift扩展存储属性
Swift默认只能扩展计算属性无法扩展存储属性,如果想扩展存储属性就需要使用runtime。
使用runtime的两个核心方法(关联对象)
/// 设置值
/// - 参数1: 为哪个对象设置 参数2: 属性的指针地址(&+属性) 参数3: 属性的值 参数4:属性的修饰类型枚举值(可以理解为OC 属性关键字weak、copy等)
public func objc_setAssociatedObject(_ object: Any, _ key: UnsafeRawPointer, _ value: Any?, _ policy: objc_AssociationPolicy)
/// 获取值
/// - 参数1: 从哪个对象中获取 参数2:获取给属性的地址
public func objc_getAssociatedObject(_ object: Any, _ key: UnsafeRawPointer) -> Any?
policy的值枚举
public enum objc_AssociationPolicy : UInt {/// weak/**< Specifies a weak reference to the associated object. */case OBJC_ASSOCIATION_ASSIGN/// retain nonatomic (一般使用这个)/**< Specifies a strong reference to the associated object. * The association is not made atomically. */case OBJC_ASSOCIATION_RETAIN_NONATOMIC/// copy nonatomic/**< Specifies that the associated object is copied. * The association is not made atomically. */case OBJC_ASSOCIATION_COPY_NONATOMIC/// retain/**< Specifies a strong reference to the associated object.* The association is made atomically. */case OBJC_ASSOCIATION_RETAIN/// copy/**< Specifies that the associated object is copied.* The association is made atomically. */case OBJC_ASSOCIATION_COPY
}
示例:为UIViewController添加导航栏透明度和颜色存储属性
通过使用私有结构体静态变量属性、扩展计算属性和runtime赋值获取实行swift扩展存储属性
/// 假如给每个Controller 添加两个存储属性 记录导航栏透明度和颜色
extension UIViewController {/// 使用 私 结构体 并设置静态变量属性 作为存储fileprivate struct AssociatedKeys {static var navBarAlpha: CGFloat = 1.0static var navBarColor: UIColor = UIColor.white}/// 再使用计算属性的方式 保存open var navBarBgAlpha: CGFloat {get {guard let alpha = objc_getAssociatedObject(self, &AssociatedKeys.navBarAlpha) as? CGFloat else {return 1.0}return alpha}set {let alpha = max(min(newValue, 1), 0) // 必须在 0~1的范围// 属性修饰关键字 retain nonatomicobjc_setAssociatedObject(self, &AssociatedKeys.navBarAlpha, alpha, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)}}open var navBarTintColor: UIColor {get {guard let tintColor = objc_getAssociatedObject(self, &AssociatedKeys.navBarColor) as? UIColor else {return .white}return tintColor}set {navigationController?.navigationBar.tintColor = newValueobjc_setAssociatedObject(self, &AssociatedKeys.navBarColor, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)}}
}
扩展添加runtime替换方法
注意:OC中的+load 和+initlaze方法在Swift4之后都不可以用了,所以只用通过在扩展 类方法中实现方法交换,然后在应用启动的didFinishLaunch中调用。
【链接参考】
Swift 扩展存储属性相关推荐
- Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等
一.类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的) 1)都可以定义属性/方法/下标(结构体也可以定义方法了) 2)都能初始化(通过构造方法 ...
- swift_044(Swift 计算属性和存储属性的概念以及使用)
import UIKit var str = "Hello, playground" class DHButton: UIButton { /* 1.存储属性: 就是存储一个常量或 ...
- Swift面向对象基础(中)——Swift中的存储属性和计算属性
1.存储属性:存储在类.结构体里的变量或者常量 2.分为:实例存储属性.类型存储属性 3.所有的存储属性必须显示的指定初始值,在定义时或者构造器当中指定 4.可选类型的存储属性可以不指定初始值 1 i ...
- swift扩展_Swift扩展
swift扩展 Continuing with our series of Swift tutorials, we'll be discussing and playing around with S ...
- Swift --- 扩展(Extention)
Swift这种的扩展,有点类似于OC中的分类(Category) 扩展可以为枚举.结构体.类.协议添加新功能 可以添加方法.计算属性.下标.(便捷)初始化器.嵌套类型.协议等等 扩展不能办到的事情 1 ...
- swift 扩展_24个用于更清洁代码的Swift扩展
swift 扩展 One of the best features of both Swift and Objective-C, in my opinion, is extensions. They ...
- Swift Property Wrapper 属性包装器
@propertyWrapper属性包装器:在定义存储属性时添加一个分离层,代表该属性被包装起来,且在包装器内部可以做一些事情.把一些通用复用的代码放在了包装器中,比如线程安全检查或者数据存储到数据库 ...
- 【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )
文章目录 I . 扩展属性 总结 II . 扩展属性 定义格式 III . 扩展属性 标准示例 IV . 扩展属性 注意事项 V . 扩展属性 本质分析 VI . 扩展属性 代码示例解析 I . 扩展 ...
- php计算属性集的闭包,关于swift:计算属性与带闭包的属性集之间的区别
我是Swift的新手. 计算属性和设置为闭包的属性之间有什么区别? 我知道每次都会重新计算一个计算属性. 封盖是否有所不同? 即 关闭: var pushBehavior: UIPushBehavio ...
最新文章
- 始于TensorFlow ,终于PyTorch
- hostapd移植与使用
- Spring配置iBatis多个SqlMapConfig.xml
- python的本质,讨论 - 廖雪峰的官方网站
- C/C++中near和far的区别
- hibernate dialect 方言 sqlserver2000 的方言
- AduSkin - UI 追求极致,永臻完美
- android自定义View学习(一)----创建一个视图类
- Patrick Hughes - 错觉3D雕塑艺术
- java imapi_读写DVD / CD-Java
- linux 内核代码怎么下载,centos的linux内核源码下载方法
- matlab画图入门教程
- 微信小程序轮播图禁止滚动
- 使用Petalinux定制自己的linux系统
- java上传下载原理_Java上传下载文件原理
- 谷歌发布深度学习Efficient Net新架构,各方面表现全面碾压卷积神经网络
- 我是鉴黄师,在工作中遇到了我的前女友……
- NETSCOUT Aircheck G2-TA-KT无线WIFI测试标准
- 千股跌停后回暖,你敢抄底吗?
- Integrated Data Network (IDN) and Thomson Reuters Elektron