Swift 2.0 复制 OBJC_ASSOCIATION_RETAIN

标签 swift objective-c-runtime swift2

我正在扩展 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/

相关文章:

ios - Swift 2.2 AVPlayer 错误处理

ios - 如何在 Swift 中列出所有符合协议(protocol)的类?

swift - 当用户在单元格中键入内容时,使 UITableView 标题自动调整大小

swift - 停止旧动画并开始新动画,一旦我改变片段, swift

ios - WKWebView 对 503 错误没有反应

objective-c - 仅通过 Objective-C 运行时函数使用 NSAutoreleasePool

Objective-C 运行时 : What does declaring a variable of type Class (objc_class) conforming to a protocol mean?

ios - 无法调用 dispatch_get_global_queue

ios - 从包含对象名称的字符串访问对象的属性

ios - #警告: C-style for statement is deprecated and will be removed in a future version of Swift