2016-03-03 4 views
7

Mein Team hat entschieden, dass neue Dateien in swift geschrieben werden sollten, und ich sehe ein seltsames Problem bei der Verwendung von KVC in einem Objective-C-Objekt, um eine Eigenschaft für ein Swift-Objekt festzulegen.Warum kann ich KVC von einem Objective-C-Objekt nicht zu einer Swift-Eigenschaft verwenden?

Meine Objective-C setzt eine Eigenschaft wie folgt: [textObject setValue:0.0 forKey:@"fontSize"]

Mein Swift Objekt (textObject) eine individuelle Setter/Getter für dieses Objekt.

var fontSize: CGFloat? { 
     get { 
     return internalTextGraphic?.fontSize 
     } 
     set { 
      internalTextGraphic?.fontSize = newValue 
     } 
    } 

Allerdings, wenn ich einen Haltepunkt in der set gesetzt, es wird nie getroffen.

Ich habe Objective-C-Objekte, die auch diesen Aufruf erhalten, und ich implementiere einfach -setFontSize, und die Ausführung tritt ordnungsgemäß ein.

Warum kann ich nicht in meine set Methode durch -setValueForKey gehen? Ich habe 100% bestätigt, dass die textObject existiert und der richtige Typ ist.

EDIT:
Martin R ist richtig, ich hatte die Art ein nicht-optional zu machen. Das ist mein Arbeitscode:

var fontSize: CGFloat { 
     get { 
     var retFontSize: CGFloat = 0.0 
     if let fontSize = internalTextGraphic?.fontSize { 
      retFontSize = fontSize 
     } 
     return retFontSize 
     } 
     set { 
     if let textGraphic = internalTextGraphic { 
      textGraphic.fontSize = newValue 
     } 
     } 
    } 

Antwort

8

Der Grund dafür ist, dass ein Swift optional Struktur oder Enum (in Ihrem Fall CGFloat?) nicht darstellbare in Objective-C ist (und Sie werden diese Eigenschaft nicht in der generierten sehen "Project-Swift.h" Header-Datei). Das wird noch deutlicher wenn Sie die Eigenschaft explizit mit @objc markieren, dann werden Sie die Fehlermeldung

 
error: property cannot be marked @objc because its type cannot be represented in Objective-C 

bekommen Wenn Sie den Objekttyp auf die nicht-optionalen CGFloat dann KVC erwartet funktioniert wie ändern. Es funktioniert auch mit einem optionalen Klassentyp, wie NSNumber?.

+1

* "ein Swift optional ist in Objective-C nicht darstellbar" * - Nun, das gilt nicht für optionale Klassen/Protokolltypen, aber es gilt für Strukturen/enums, von denen CGFloat eins ist. – jtbandes

+0

@jtbandes: Sie haben Recht, behoben - danke! –

Verwandte Themen