在 Objective-C 中,我经常使用这样的模式:static void*
作为识别标签。有时这些标签仅在该函数/方法中使用,因此将变量放置在函数中很方便。
例如:
MyObscureObject* GetSomeObscureProperty(id obj) {
static void* const ObscurePropertyTag = &ObscurePropertyTag;
MyObscureObject* propValue = objc_getAssociatedObject(id,ObscurePropertyTag);
if(!propValue) {
propValue = ... // lazy-instantiate property
objc_setAssociatedObject(obj,ObscurePropertyTag,propValue, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
return propValue;
}
问题是,怎么写ObscurePropertyTag
Swift 中指向自身的私有常量指针? (最好是 2.1,但未来已经发布的版本应该没问题)
我环顾四周,看来我必须把这个ObscurePropertyTag
作为成员变量,似乎没有办法解决它。
与 (Objective-)C 不同,您不能获取某个地址
Swift 中未初始化的变量。因此创建一个自引用
指针是一个两步过程:
Swift 2:
var ptr : UnsafePointer<Void> = nil
withUnsafeMutablePointer(&ptr) { $0.memory = UnsafePointer($0) }
Swift 3:
var ptr = UnsafeRawPointer(bitPattern: 1)!
ptr = withUnsafePointer(to: &ptr) { UnsafeRawPointer($0) }
出于您的目的,使用地址是否更容易global变量与&
, 参见
例子
如果您想将“标签”的范围限制为函数本身
那么你可以使用static局部变量内部struct
。例子:
func obscureProperty(obj : AnyObject) -> MyObscureObject {
struct Tag {
static var ObscurePropertyTag : Int = 0
}
if let propValue = objc_getAssociatedObject(obj, &Tag.ObscurePropertyTag) as? MyObscureObject {
return propValue
}
let propValue = ... // lazy instantiate property value
objc_setAssociatedObject(obj, &Tag.ObscurePropertyTag,propValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return propValue
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)