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 扩展存储属性相关推荐

  1. Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

    一.类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的) 1)都可以定义属性/方法/下标(结构体也可以定义方法了) 2)都能初始化(通过构造方法 ...

  2. swift_044(Swift 计算属性和存储属性的概念以及使用)

    import UIKit var str = "Hello, playground" class DHButton: UIButton { /* 1.存储属性: 就是存储一个常量或 ...

  3. Swift面向对象基础(中)——Swift中的存储属性和计算属性

    1.存储属性:存储在类.结构体里的变量或者常量 2.分为:实例存储属性.类型存储属性 3.所有的存储属性必须显示的指定初始值,在定义时或者构造器当中指定 4.可选类型的存储属性可以不指定初始值 1 i ...

  4. swift扩展_Swift扩展

    swift扩展 Continuing with our series of Swift tutorials, we'll be discussing and playing around with S ...

  5. Swift --- 扩展(Extention)

    Swift这种的扩展,有点类似于OC中的分类(Category) 扩展可以为枚举.结构体.类.协议添加新功能 可以添加方法.计算属性.下标.(便捷)初始化器.嵌套类型.协议等等 扩展不能办到的事情 1 ...

  6. swift 扩展_24个用于更清洁代码的Swift扩展

    swift 扩展 One of the best features of both Swift and Objective-C, in my opinion, is extensions. They ...

  7. Swift Property Wrapper 属性包装器

    @propertyWrapper属性包装器:在定义存储属性时添加一个分离层,代表该属性被包装起来,且在包装器内部可以做一些事情.把一些通用复用的代码放在了包装器中,比如线程安全检查或者数据存储到数据库 ...

  8. 【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )

    文章目录 I . 扩展属性 总结 II . 扩展属性 定义格式 III . 扩展属性 标准示例 IV . 扩展属性 注意事项 V . 扩展属性 本质分析 VI . 扩展属性 代码示例解析 I . 扩展 ...

  9. php计算属性集的闭包,关于swift:计算属性与带闭包的属性集之间的区别

    我是Swift的新手. 计算属性和设置为闭包的属性之间有什么区别? 我知道每次都会重新计算一个计算属性. 封盖是否有所不同? 即 关闭: var pushBehavior: UIPushBehavio ...

最新文章

  1. 始于TensorFlow ,终于PyTorch
  2. hostapd移植与使用
  3. Spring配置iBatis多个SqlMapConfig.xml
  4. python的本质,讨论 - 廖雪峰的官方网站
  5. C/C++中near和far的区别
  6. hibernate dialect 方言 sqlserver2000 的方言
  7. AduSkin - UI 追求极致,永臻完美
  8. android自定义View学习(一)----创建一个视图类
  9. Patrick Hughes - 错觉3D雕塑艺术
  10. java imapi_读写DVD / CD-Java
  11. linux 内核代码怎么下载,centos的linux内核源码下载方法
  12. matlab画图入门教程
  13. 微信小程序轮播图禁止滚动
  14. 使用Petalinux定制自己的linux系统
  15. java上传下载原理_Java上传下载文件原理
  16. 谷歌发布深度学习Efficient Net新架构,各方面表现全面碾压卷积神经网络
  17. 我是鉴黄师,在工作中遇到了我的前女友……
  18. NETSCOUT Aircheck G2-TA-KT无线WIFI测试标准
  19. 千股跌停后回暖,你敢抄底吗?
  20. Integrated Data Network (IDN) and Thomson Reuters Elektron

热门文章

  1. 《大数据导论》——1.4节案例学习背景
  2. file invalid or corrupt. -vs2010
  3. MVC,三层架构,工厂模型,七层
  4. GAE上使用Struts2
  5. 源码解析 React Hook 构建过程
  6. TensorFlow学习笔记(一):数据操作指南
  7. MFC命令消息的路由
  8. [译]ava 设计模式之享元
  9. 关于linux内存管理
  10. 关于reviewboard汉化