我正在扩展 Swift 2.0 中的一些类以使用 ReactiveCocoa 3.0(swift-2.0 分支),但遇到了一些麻烦。
我关注了 Colin Eberhardt's tutorial , 并复制粘贴了他的一些 UIKit extension logic转到我的 OS X 应用程序。除了这个属性之外,它都编译得很好:UInt(OBJC_ASSOCIATION_RETAIN)
,这给了我以下编译器错误。
use of unresolved identifier
如何访问此属性?我试过 import ObjectiveC
和 #import <objc/runtime.h>
在头文件中,但似乎没有任何效果。
func lazyAssociatedProperty<T: AnyObject>(host: AnyObject, key: UnsafePointer<Void>, factory: ()->T) -> T {
return objc_getAssociatedObject(host, key) as? T ?? {
let associatedProperty = factory()
objc_setAssociatedObject(host, key, associatedProperty, UInt(OBJC_ASSOCIATION_RETAIN)) // <-- Use of unresolved identifier
return associatedProperty
}()
}
最佳答案
这实际上现在作为一个名为 objc_AssociationPolicy
的枚举导入到 Swift 中。定义:
enum objc_AssociationPolicy : UInt {
case OBJC_ASSOCIATION_ASSIGN
case OBJC_ASSOCIATION_RETAIN_NONATOMIC
case OBJC_ASSOCIATION_COPY_NONATOMIC
case OBJC_ASSOCIATION_RETAIN
case OBJC_ASSOCIATION_COPY
}
意味着它可以按如下方式使用。
objc_setAssociatedObject(host, key, associatedProperty, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
或使用枚举速记语法。
objc_setAssociatedObject(host, key, associatedProperty, .OBJC_ASSOCIATION_RETAIN)
请注意 objc_setAssociatedObject
也已更新为采用 objc_AssociationPolicy
参数而不是 UInt
从而无需访问枚举的 rawValue
在这里。
关于Swift 2.0 复制 OBJC_ASSOCIATION_RETAIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30872626/