2014-06-10 6 views
10

Qual è l'equivalente del seguente codice Objective-C in Swift?Creazione di un Getter e Setter equivalenti Objective-C in Swift

@property (nonatomic, assign, getter = isOpen) BOOL open; 

In particolare, come si fa a dichiarare una variabile a Swift per sintetizzare il getter con un nome personalizzato?

Inoltre, come è possibile modificare l'implementazione del getter and setter in seguito?

+7

Penso che si ha realmente bisogno di leggere il libro di Apple su Swift. È gratis! – ColinE

+8

@ColinE: rispondi al 50% circa delle domande in [tag: swift-language] – 68cherries

+2

Vorrei incoraggiare gli elettori vicini a leggere la discussione qui. http://meta.stackexchange.com/questions/86043/introduce-a-general-reference-close-reason – jtbandes

risposta

17

La tua ipotesi era vicina, ma alcune cose potrebbero essere cambiate. Cercherò di aiutarti ad avvicinarti il ​​più possibile alla versione Objective-C.

Prima di tutto, lo nonatomic e assign sono irrilevanti in rapido. Questo ci lascia con

@property (getter = isOpen) BOOL open; 

Poiché le proprietà in swift sono solo variabili di istanza, la traduzione rapida sarebbe la seguente.

var open:Bool 

Anche se questo ha la stessa funzionalità di base della versione Objective-C, viene a mancare il getter di nome (isOpen). Sfortunatamente, non esiste una traduzione diretta per questo (ancora). Potresti usare un getter e un setter personalizzati.

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

Un lavoro piuttosto grezzo intorno sarebbe quella di fare un altro funzione letteralmente chiamato isOpen che avrebbe agito come un getter.

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

In conclusione, quello che chiedete è solo leggermente possibile, ma si spera in versioni successive di una rapida può diventare una realtà.

+1

Questo sarà molto più diffuso una volta che Swift avrà i meccanismi di controllo dell'accesso (sono stati [promessi dal team Swift] (https://devforums.apple.com/thread/227288?start=0&tstart=0)). – Erik

+0

Grazie. Ha senso ora – mike

+2

Un getter con nome è scritto: 'var isOpen: Bool {get {}}' e se vuoi anche avere un setter usa 'var isOpen: Bool {set {} get {}}' - ogni volta che un valore è impostato viene passato al setter come 'newValue' - nota anche che la proprietà deve avere un tipo dichiarato in entrambe le istanze – sketchyTech

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

conduce a questa intestazione generata:

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

Non vale niente che si possa ottenere lo stesso comportamento per il setter spostando la riga '@objc () sopra la linea' set'. Dato che è un setter, richiede un parametro, quindi avrai anche bisogno di un ':' dopo il nome del setter. –

+0

non funziona per me :(, dose non appare nella lista dei getter quando cerco di ottenere getter dalla rapida classe unsigned int propertyCount = 0; objc_property_t * proprietà = class_copyPropertyList ([classe di oggetti], e propertyCount); NSDictionary * info = [self getObjectInfoWithProperties: proprietà propertyCount: propertyCount]; NSMutableArray * propertyGetters = [info objectForKey: @ "propertyGetters"]; –