2015-06-16 22 views
5

Ich erweitere einige Klassen in Swift 2.0, um mit ReactiveCocoa 3.0 (Swift-2.0-Zweig) zu arbeiten, habe aber einige Probleme bekommen.Swift 2.0 Replikat OBJC_ASSOCIATION_RETAIN

Ich habe Colin Eberhardt's tutorial gefolgt, und kopiere einige seiner UIKit extension logic über meine OS X App. Alles zusammen kompiliert, abgesehen von dieser Eigenschaft: UInt(OBJC_ASSOCIATION_RETAIN), die mir den folgenden Compiler-Fehler gibt.

Verwendung von ungelöster Kennung

Wie kann ich diese Eigenschaft zugreifen? Ich habe versucht, import ObjectiveC und #import <objc/runtime.h> in der Header-Datei, aber nichts scheint zu funktionieren.

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 
    }() 
} 

Antwort

14

eigentlich jetzt objc_AssociationPolicy als Enum in Swift importiert benannt Dies wird. 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 
} 

Bedeutung, dass es wie folgt verwendet werden kann.

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

Oder mit Kurzschrift-Syntax.

objc_setAssociatedObject(host, key, associatedProperty, .OBJC_ASSOCIATION_RETAIN) 

Beachten Sie, dass objc_setAssociatedObject auch rawValue hier die Enum des zuzugreifen es unnötig zu nehmen aktualisiert ein objc_AssociationPolicy Argument statt UInt machen.