5

我正在扩展 Swift 2.0 中的一些类以使用 ReactiveCocoa 3.0(swift-2.0 分支),但遇到了一些麻烦。

我遵循 Colin Eberhardt 的教程,并将他的一些UIKit 扩展逻辑复制粘贴到我的 OS X 应用程序中。除了这个属性之外,它都编译得很好:UInt(OBJC_ASSOCIATION_RETAIN),它给了我以下编译器错误。

使用未解析的标识符

我怎样才能访问这个属性?我已经尝试在头文件中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
    }()
}
4

1 回答 1

17

这实际上现在作为一个名为objc_AssociationPolicy. 定义:

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

于 2015-06-16T16:07:33.470 回答