3 回答
TA贡献1809条经验 获得超8个赞
与Objective-C一样,您无法将存储的属性添加到现有类中。如果您正在扩展Objective-C类(UIView肯定是一个),您仍然可以使用关联对象来模拟存储的属性:
对于Swift 1
import ObjectiveC
private var xoAssociationKey: UInt8 = 0
extension UIView {
var xo: PFObject! {
get {
return objc_getAssociatedObject(self, &xoAssociationKey) as? PFObject
}
set(newValue) {
objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN))
}
}
}
关联键是一个指针,应该是每个关联的唯一指针。为此,我们创建一个私有全局变量,并使用它的内存地址作为&运算符的键。有关如何在Swift中处理指针的详细信息,请参阅使用Swift with Cocoa和Objective-C 。
更新为Swift 2和3
import ObjectiveC
private var xoAssociationKey: UInt8 = 0
extension UIView {
var xo: PFObject! {
get {
return objc_getAssociatedObject(self, &xoAssociationKey) as? PFObject
}
set(newValue) {
objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}
}
更新为Swift 4
在Swift 4中,它更加简单。Holder结构将包含我们的计算属性将向世界公开的私有值,从而产生存储属性行为的错觉。
资源
extension UIViewController {
struct Holder {
static var _myComputedProperty:Bool = false
}
var myComputedProperty:Bool {
get {
return Holder._myComputedProperty
}
set(newValue) {
Holder._myComputedProperty = newValue
}
}
}
- 3 回答
- 0 关注
- 805 浏览
添加回答
举报