Swift 2.0 次复制 OBJC_ASSOCIATION_RETAIN

Swift 2.0 replicate OBJC_ASSOCIATION_RETAIN

我正在 Swift 2.0 中扩展一些 类 以与 ReactiveCocoa 3.0(swift-2.0 分支)一起工作,但是 运行 遇到了一些麻烦。

我跟随 Colin Eberhardt's tutorial, and have copy pasted some of his 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)

或使用枚举 shorthand 语法。

objc_setAssociatedObject(host, key, associatedProperty, .OBJC_ASSOCIATION_RETAIN)

请注意,objc_setAssociatedObject 也已更新为采用 objc_AssociationPolicy 参数而不是 UInt,因此无需在此处访问枚举的 rawValue