2014-09-13 13 views
19

Ich bin ein Konvertierungsprojekt in Swift-Code und stieß auf ein Problem in einem Setter. Meine Objective-C-Code sah wie folgt aus:Swift - Custom Setter auf Eigenschaft

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

     [self useDocument]; 
    } 
} 

und erlaubt mein View Controller diese jedes Mal das Dokument gesetzt wurde ausgeführt (in der Regel in der prepareForSegue: Methode des präsentierenden-View-Controller).

Ich habe die Eigenschaft Beobachter willSet und didSet gefunden, aber sie funktionieren nur, wenn die Eigenschaft aktualisiert wird, nicht wenn es initialisiert und aktualisiert wird.

Irgendwelche Ideen? Dank

UPDATE

nach get versucht, {} und setzen {} Ich erhalte die EXC_BAD_ACCESS Fehler

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

     useDocument() 
    } 
} 
+0

nicht die Eigenschaft Beobachter anwenden. Verwenden Sie get {} und erhalten Sie {}. Weitere Informationen finden Sie im Abschnitt [Berechnete Eigenschaften] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html). –

Antwort

41

Sie nicht set so verwenden können, denn wenn man self.document = newValue Sie rufen die gerade am telefonieren Setzer wieder; Sie haben eine Endlosschleife erstellt.

Was haben Sie stattdessen zu tun ist, eine separate Eigenschaft erstellen tatsächlich in den Wert zu speichern:

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) scheint geeigneter zu sein. – Cfr

+16

Ich verstehe nicht, warum der Compiler explizit das Hinzufügen von Selbst in den Setter verlangt, wenn das Ergebnis eine Endlosschleife sein wird. Ich bin der Einzige, der denkt, dass es keine elegante Lösung ist, eine private Var zu verwenden? Eine Getter- und Setter-Funktion macht einen besseren Job –

+3

Swift ist in Arbeit. Es gibt viele kleine Dinge wie diese, die ich hoffe, dass Apple den Compiler automatisch die Drecksarbeit für Sie erledigt, so dass Sie sich nur auf Codierung konzentrieren können, anstatt ständig wie "Arrrrgh" – CommaToast

1

Hier ist ein Swift 3-Version

var document : UIDocument? = nil { 
    didSet { 
     useDocument() 
    } 
} 
Verwandte Themen