Swift Extension 添加存储属性

Swift不允许在extension中直接添加「存储属性」。但是在我们的实际开发中经常会用到使用extension来给已经创建好的类添加新的「存储属性」。例如,给UIView类添加一个identifier属性来区别不同UIView实例。

如果直接在UIViewextension中添加,编译器会报Extensions must not contain stored properties。如下图:

直接在·extension·中添加存储属性

既然不能直接定义存储属性identifier,我们可以使用关联属性来实现想要的功能。代码如下:


public extension UIView {
    private struct AssociatedKey {
        static var identifier: String = "identifier"
    }
    
    public var identifier: String {
        get {
            return objc_getAssociatedObject(self, &AssociatedKey.identifier) as? String ?? ""
        }
        
        set {
            objc_setAssociatedObject(self, &AssociatedKey.identifier, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
        }
    }
}
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        print("view's identifier:\(self.view.identifier)")
        view.identifier = "root view"
        print("view's identifier:\(self.view.identifier)")
    }
}

Result: ----------------------
view's identifier:
view's identifier:root view
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,894评论 2 9
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,362评论 0 11
  • 【昆达里尼瑜伽 40天打卡】(day14) 【平衡十个身体奎亚】 倒计时:26天 日期:2018年3月24日 早上...
    猪猪1琪琪2猫猫3阅读 1,867评论 0 1
  • 做饭本身就是一种乐趣 而记录这一乐趣 更是让人赏心悦目 满满的成就感 ShakeOrange 就画了一本 看起来很...
    味他菜谱阅读 214评论 0 1