美文网首页
Swift 中为一个扩展添加实例变量

Swift 中为一个扩展添加实例变量

作者: TomatosX | 来源:发表于2017-08-07 18:03 被阅读25次

众所周知,在扩展中是不能为其添加实例变量的,那么如果非要加一个实例变量呢?我们可以用property配合Associated Object的方式,将一个对象关联到已有的要扩展的类上。

class MyClass {}

private var key: Void?

extension MyClass {
  
    var title: String? {
        get {
            return objc_getAssociatedObject(self, &key) as? String
        }
        set {
            objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

let my = MyClass()
my.title // nil

my.title = "Hello"
my.title // Hello

key 的类型在这里声明为了 Void?,并且通过 & 操作符取地址并作为 UnsafePointer<Void> 类型被传入。这在 Swift 与 C 协作和指针操作时是一种很常见的用法。

相关文章

  • Swift 中为一个扩展添加实例变量

    众所周知,在扩展中是不能为其添加实例变量的,那么如果非要加一个实例变量呢?我们可以用property配合Assoc...

  • Swift Associated Object

    Swift中Associated Object使用 使用关联对象在扩展中增加实例字段。 需要定义一个本地变量(pr...

  • Swift extension的妙用

    1.简单介绍extension 在Swift中扩展可以: 添加计算实例属性和计算类型属性; 定义实例方法和类型方法...

  • Swift 扩展(extension)详解

    在Swift中扩展可以: 添加计算实例属性和计算类型属性; 定义实例方法和类型方法; 提供新构造器; 定义下标; ...

  • OC中Category(与Swift中的扩展类似)

    在Category中添加成员变量 .h文件 .m文件 扩展(与swift的扩展完全不同,只是名字一样而已) 一般用...

  • Swift中的Extensions

    扩展就是为一个类、结构体、枚举、协议,添加扩展功能.与OC中的分类及其相似,不同的是Swift的扩展没有名字. S...

  • Swift3.1_扩展

    扩展 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能,但是不能重写已有的功能。 Swift中的扩展可以...

  • Category笔记

    为什么Category无法添加实例变量? Category是无法添加实例变量的,当一个类被编译时,实例变量的布局也...

  • ReactorKit 通过扩展给实例添加实例变量

    ReactorKit 中定义了 Reactor 协议,同时对 Reactor 协议进行了扩展。一个类型通过继承 R...

  • swift --1 extension扩展

    swift 中的扩展可以: 添加计算型属性和计算型静态属性 定义实例方法和类型方法 提供新的构造器 定义下标 定义...

网友评论

      本文标题:Swift 中为一个扩展添加实例变量

      本文链接:https://www.haomeiwen.com/subject/mnvalxtx.html