Swift 2.0复制OBJC_ASSOCIATION_RETAIN [英] Swift 2.0 replicate OBJC_ASSOCIATION_RETAIN

查看:167
本文介绍了Swift 2.0复制OBJC_ASSOCIATION_RETAIN的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm extending some classes in Swift 2.0 to work with ReactiveCocoa 3.0 (swift-2.0 branch), but have run into some trouble.

我关注了Colin Eberhardt的教程,并已复制粘贴了他的一些 UIKit扩展逻辑转到我的OS X应用.除了此属性:UInt(OBJC_ASSOCIATION_RETAIN),所有这些都可以很好地编译,从而给我带来以下编译器错误.

I've followed Colin Eberhardt's tutorial, and have copy pasted some of his UIKit extension logic over to my OS X app. It all compiles fine, apart from this property: UInt(OBJC_ASSOCIATION_RETAIN), which gives me the following compiler error.

使用未解析的标识符

use of unresolved identifier

如何访问此属性?我试图在头文件中import ObjectiveC#import <objc/runtime.h>,但是似乎没有任何作用.

How can I access this property? I've tried to import ObjectiveC and #import <objc/runtime.h> in the header file, but nothing seems to work.

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中.定义:

This is actually now imported into Swift as an enum named objc_AssociationPolicy. Definition:

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
}

表示可以按以下方式使用.

Meaning that it can be used as follows.

objc_setAssociatedObject(host, key, associatedProperty, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)

或使用枚举速记语法.

objc_setAssociatedObject(host, key, associatedProperty, .OBJC_ASSOCIATION_RETAIN)

请注意,objc_setAssociatedObject也已更新为采用objc_AssociationPolicy自变量,而不是UInt,从而无需在此处访问枚举的rawValue.

Note that objc_setAssociatedObject has also been updated to take a objc_AssociationPolicy argument instead of UInt making it unnecessary to access the enum's rawValue here.

这篇关于Swift 2.0复制OBJC_ASSOCIATION_RETAIN的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆