如何在Swift扩展中添加存储属性

.一般而言,swift的扩展Extension只能添加计算属性,不能添加存储属性。当然,如果利用run time也可以实现extension添加存储属性的效果.
.如我给UIButton这个类添加了如下属性:

private var key: Void?
func createImageWithColor(_ color: UIColor) -> UIImage? {
let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(rect.size)
let context = UIGraphicsGetCurrentContext()
context?.setFillColor(color.cgColor)
context?.fill(rect)
let theImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return theImage
}
extension UIButton {
@IBInspectable var normalColor: UIColor? {
    get {
        return objc_getAssociatedObject(self, &key) as? UIColor
    }
    set(newValue) {
        objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        setBackGroundColor(normalColor ?? UIColor.white, state: UIControlState())
    }
}

@IBInspectable var highlightedColor: UIColor? {
    get {
        return objc_getAssociatedObject(self, &key) as? UIColor
    }
    set(newValue) {
        objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        setBackGroundColor(highlightedColor ?? UIColor.lightGray, state: .highlighted)
    }
}

fileprivate func setBackGroundColor(_ backGroundColor: UIColor, state: UIControlState) {
    let image = createImageWithColor(backGroundColor)
    setBackgroundImage(image, for: state)
   }
  }

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 7,969评论 4 42
  • 早上我开锅拿馒头的时候,锅盖随手放在内侧滴小锅旁边,锅盖倒了,把灶台边上的碗和勺子挤下去。。哗啦。。碎了。。 好吧...
    小猪天堂阅读 100评论 2 2
  • 丁艺琳阅读 127评论 0 0