swift 分类可以添加属性吗

swift 分类可以添加属性吗,第1张

比如,我有一个ELCImagePickerController类,需要增加一个tag属性,代码如下:

import ObjectiveC

private var xoTag: UInt = 0

extension ELCImagePickerController {

var tag: UInt {

get {

return (objc_getAssociatedObject(self, &xoTag) as? UInt)!

}

set(newValue) {

objc_setAssociatedObject(self, &xoTag, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN))

}

}

}

private  var  middleNameKey :Void?

extension User {

    var  middleName :String? {

        get {

            return objc_getAssociatedObject( self , &middleNameKey) as ? String

        }

        set {

            objc_setAssociatedObject( self , &middleNameKey, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)

        }

    }

}

使用

let  user =User()

user.middleName="jake"

print(user.middleName)

在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 borderColor: UIColor? {

get {

return objc_getAssociatedObject(self, &key) as? UIColor

}

set(newValue) {

objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

layer.borderColor = borderColor?.cgColor

}

}

@IBInspectable var borderWidth: CGFloat? {

get {

return objc_getAssociatedObject(self, &key) as? CGFloat

}

set(newValue) {

objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

layer.borderWidth = borderWidth ?? 0

}

}

@IBInspectable var cornerRadius: CGFloat? {

get {

return objc_getAssociatedObject(self, &key) as? CGFloat

}

set(newValue) {

objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

layer.cornerRadius = cornerRadius ?? 0

layer.masksToBounds = cornerRadius != 0

}

}

@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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11433362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存