2014-09-13 19 views
19

Sto convertendo un progetto in codice Swift e ho riscontrato un problema in un setter. Il mio codice Objective-C si presentava così:Swift - Custom setter sulla proprietà

- (void)setDocument:(MyDocument *)document 
{ 
    if (![_document isEqual:document]) { 
     _document = document; 

     [self useDocument]; 
    } 
} 

e ha permesso la mia View Controller per eseguire questa operazione ogni volta che il documento è stato fissato (in genere nel metodo della View Controller presenta prepareForSegue:).

Ho trovato gli osservatori di proprietà willSet e didSet ma funzionano solo quando la proprietà viene aggiornata, non quando è inizializzata e aggiornata.

Qualche idea? Grazie

UPDATE

dopo aver provato get {} e impostare {} ottengo l'errore EXC_BAD_ACCESS

var document: UIDocument? { 
    get { 
     return self.document! 
    } 
    set { 
     self.document = newValue 

     useDocument() 
    } 
} 
+0

Non usare gli osservatori di proprietà. Usa get {} e ottieni {}. Controlla la sezione Proprietà calcolate [qui] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html). –

risposta

41

Non è possibile utilizzare set del genere perché quando si chiama self.document = newValue si sta solo chiamando il setter di nuovo; hai creato un ciclo infinito.

Quello che devi fare, invece è creare una proprietà separata per memorizzare in realtà il valore in:

private var _document: UIDocument? = nil 
var document: UIDocument? { 
    get { 
     return self._document 
    } 
    set { 
     self._document = newValue 
     useDocument() 
    } 
} 
+22

['didSet'] (http://stackoverflow.com/a/24334029/187663) sembra più adatto. – Cfr

+16

Non capisco perché il compilatore chieda esplicitamente di aggiungere self al setter se il risultato sarà un ciclo infinito. Sono l'unico qui a pensare che non sia una soluzione elegante usare una var privata? Una funzione getter and setter renderà un lavoro migliore –

+3

Swift è un work in progress. Ci sono molte piccole cose come questa, che spero che Apple faccia automaticamente il lavoro sporco per te in modo che tu possa concentrarti sulla codifica invece di essere costantemente come "arrrrgh" – CommaToast

1

Ecco una Swift 3 Versione

var document : UIDocument? = nil { 
    didSet { 
     useDocument() 
    } 
} 
Problemi correlati