在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;
}
问题是,如何在Swift中编写ObscurePropertyTag
私有常量指针到自身? (优选2.1但未来已公布的版本应该没问题)
我环顾四周,似乎我必须将此ObscurePropertyTag
作为成员变量,似乎没有办法绕过它。
答案 0 :(得分:3)
与(Objective-)C不同,你不能取一个地址 Swift中未初始化的变量。因此创建自引用 指针分为两步:
Swift 2:
var ptr : UnsafePointer<Void> = nil
withUnsafeMutablePointer(&ptr) { $0.memory = UnsafePointer($0) }
斯威夫特3:
var ptr = UnsafeRawPointer(bitPattern: 1)!
ptr = withUnsafePointer(to: &ptr) { UnsafeRawPointer($0) }
出于您的目的,使用&
的全局变量的地址是否更容易,请参阅
示例
如果要将“标记”的范围限制为函数本身
然后,您可以在本地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
}
答案 1 :(得分:0)
试试这个:
var GetSomeObscureProperty: MyObscureObject = nil
withUnsafePointer(& GetSomeObscureProperty) {
GetSomeObscureProperty = MyObscureObject($0)
}
简而言之
let GetSomeObscureProperty = UnsafePointer<()>()