2014-06-10 5 views
10

Was entspricht dem folgenden Objective-C-Code in Swift?Erstellen eines Objective-C-äquivalenten Getter und Setter in Swift

Wie deklariert man eine Variable in Swift, um den Getter mit einem benutzerdefinierten Namen zu synthetisieren?

Wie können Sie anschließend die Implementierung von Getter und Setter überschreiben?

+7

Ich glaube, Sie wirklich Apples Buch über Swift müssen lesen. Es ist kostenlos! – ColinE

+8

@Coline: Antwort auf etwa 50% der Fragen in [tag: swift-language] – 68cherries

+2

Ich würde nahe Wähler ermutigen, die Diskussion hier zu lesen. http://meta.stackexchange.com/questions/86043/introduce-a-general-reference-close-reason – jtbandes

Antwort

17

Ihre Annahme war knapp, aber ein paar Dinge könnten geändert werden. Ich werde versuchen, Ihnen zu helfen, der Objective-C-Version so nahe wie möglich zu kommen.

Zunächst sind die nonatomic und assign irrelevant in swift. Das lässt uns mit

@property (getter = isOpen) BOOL open; 

Da Eigenschaften in Swift nur Instanzvariablen sind, wäre die schnelle Übersetzung wie folgt.

var open:Bool 

Obwohl dies die gleiche grundlegende Funktionalität wie die Objective-C-Version hat, fehlt es den Namen Getter (isOpen). Leider gibt es (noch) keine direkte Übersetzung zu swift. Sie könnten einen benutzerdefinierten Getter und Setter verwenden.

var open:Bool { 
    get { 
     // custom getter 
    } 
    set { 
     // custom setter 
    } 
} 

Eine ziemlich grobe Arbeit um buchstäblich andere Funktion isOpen genannt zu machen wäre, die als Getter wirken würde.

func isOpen() -> Bool { return self.open } 

Abschließend, was Sie fordern nur geringfügig möglich, aber hoffentlich in späteren Versionen von schnellen Wirklichkeit werden kann.

+1

Dies wird viel häufiger sein, sobald Swift Zugriffssteuerungsmechanismen erhält (sie wurden [vom Swift-Team versprochen] (https://devforums.apple.com/thread/227288?start=0&tstart=0)). – Erik

+0

Danke. Es macht jetzt Sinn – mike

+2

Ein benannter Getter wird geschrieben: 'var isOpen: Bool {get {}}' und wenn Sie auch einen Setter haben möchten, benutzen Sie 'var isOpen: Bool {set {} get {}}' - wann immer ein Wert gesetzt ist, wird es dem Setzer als 'newValue' übergeben - beachte auch, dass die Eigenschaft einen in beiden Instanzen deklarierten Typ haben muss – sketchyTech

15
var open: Bool { 
    @objc(isOpen) 
    get { 
     // custom getter 
    } 
    set { 
     // custom setter 
    } 
} 

führt zu diesem generierten Header:

SWIFT_CLASS("_TtC11SwiftToObjC9TestClass") 
@interface TestClass : NSObject 
@property (nonatomic, getter=isOpen) BOOL open; 
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; 
@end 
+0

Es ist nichts wert, dass das gleiche Verhalten für den Setzer erreicht werden kann, indem die Zeile "@objc ()" über die "set" -Linie bewegt wird. Da es sich um einen Setter handelt, benötigt es einen Parameter, also benötigen Sie auch ein ':' nach dem Setter-Namen. –

+0

Nichts für mich arbeiten :(, nicht in Getter Liste erscheinen Dosis, wenn ich versuche Getter aus swift Klasse zu erhalten unsigned int propertyCount = 0; objc_property_t * properties = class_copyPropertyList ([object class], & propertyCount); NSDictionary * info = [self getObjectInfoWithProperties: Eigenschaften propertyCount: propertyCount]; NSMutableArray * propertyGetters = [info objectForKey: @ "propertyGetters"]; –