美文网首页
如何在Swift扩展中添加存储属性

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

作者: michael_fang | 来源:发表于2016-10-12 00:10 被阅读3649次

.一般而言,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)
   }
  }

相关文章

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

    .一般而言,swift的扩展Extension只能添加计算属性,不能添加存储属性。当然,如果利用run time也...

  • [Swift]为Extension添加存储属性

    众所周知, 在Swift的扩展(Extension)中只能添加计算属性, 但是有时候, 我们需要添加存储属性的话,...

  • swift 扩展属性的方法

    原理:由于swift扩展不能添加存储属性,所以考虑以计算属性获取另一对象的存储属性,该对象通过动态绑定给原对象 1...

  • 协议和扩展

    Swift Extension 添加存储属性 wift不允许在extension中直接添加「存储属性」。但是在我们...

  • Swift 中的扩展

    扩展的语法 计算属性 扩展可以为现有类型添加实例计算属性以及类计算属性。但不能添加存储属性,也不能为现有的属性添加...

  • OC的@property与Swift的存储属性/计算属性类比

    Swift中的计算属性/存储属性与OC中的@property   Swift中引入了存储属性、计算属性的概念,存储...

  • iOS原理篇:关联对象

    前言 Swift中不能再extension中为类添加存储属性,如何利用关联对象变相添加属性呢? 关联对象相关API...

  • Swift之关联对象

    在swift中,展不能添加存储属性,Swift中可以使用Objective-C的关联对象(Associated O...

  • Swift进阶(三)--- 属性

    Swift的属性 在swift中,属性主要分为以下几种: 存储属性 计算属性 延迟存储属性 类型属性 一:存储属性...

  • Swift如何在应用中添加图标更换功能

    Swift如何在应用中添加图标更换功能 Swift如何在应用中添加图标更换功能

网友评论

      本文标题:如何在Swift扩展中添加存储属性

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