2015-03-13 15 views
6

Ich versuche, die folgende Swift-Klasse zu kompilieren:Optional dynamische Eigenschaften in Swift

class Waypoint: NSObject { 
    dynamic var coordinate: CLLocationCoordinate2D? 
} 

Aber ich bekomme den folgenden Compiler-Fehler:

Property cannot be marked dynamic because its type cannot be represented in Objective-C

Wenn ich coordinate ändern als nicht optional Alles funktioniert gut. Ich denke, das macht Sinn, da Objective-C kein Konzept von Optionals hat. Gibt es eine bekannte Lösung oder Workaround?

+0

Ich bin mir nicht sicher, was Sie versuchen zu tun. Sie möchten wahrscheinlich einen Beobachter auf dieser Eigenschaft? Zu welchem ​​Zweck (nur um zu wissen, wann sich das Eigentum geändert hat)? _Vielleicht kann ich Ihnen eine Alternative vorschlagen._ – lchamp

+0

@lchamp korrekt, ich möchte einen Beobachter für die Integration mit ReactiveCocoa – bloudermilk

Antwort

11

In Objective-C können Sie nil verwenden, um die Abwesenheit von Wert zu signalisieren, aber nur für Objekttypen. Swift verallgemeinert dies (und macht es typsicher) mit dem generischen Typ Optional: Sie können eine Optional<NSObject>, eine kA NSObject? haben, aber Sie können auch eine Int? oder eine CLLocationCoordinate2D? haben.

Aber CLLocationCoordinate2D ist eine Struktur - wenn Sie es in Objective-C verwenden, können Sie nicht nil auf eine Variable vom Typ CLLocationCoordinate2D zuweisen können. Deshalb erhalten Sie diesen Fehler.

Wie für eine (hässlich) Abhilfe könnte man CLLocationCoordinate2D in einem Objekt wickeln:

class CLLocationCoordinate2DObj: NSObject { 
    let val: CLLocationCoordinate2D 
    init(_ val: CLLocationCoordinate2D) { 
     self.val = val 
    } 
} 

class Waypoint: NSObject { 
    dynamic var coordinate: CLLocationCoordinate2DObj? 
} 

Leider kann man nicht eine allgemeinere Lösung mit einer generischen Objekt-Wrapper-Klasse für structs finden, als objektiv- C hat keine Generika ... Eine Alternative wäre, NSValue als Objekttyp wie described here zu verwenden, aber ich bezweifle, dass es eleganter wäre.

+0

Vielen Dank für die schnelle Antwort. Ich denke, ich werde meine eigene "Coordinate" -Klasse erstellen, wie Sie es empfehlen, und eine "toCLLocationCoordinate2D" -Methode geben, es sei denn, es gibt eine elegantere Art, die Typumwandlung zu unterstützen: 'coordinate as CLLocationCoordinate2D' – bloudermilk