Übergeben Sie self als Argument innerhalb der init Methode in Swift 1.2

8

Die folgende Klasse hat die Eigenschaft ' let ', die als implizit unverpackte Variable deklariert ist. Dies hat zuvor mit Xcode 6.2 funktioniert:

%Vor%

Nach dem Update auf Xcode 6.3 (mit Swift 1.2) treten die folgenden Kompilierungsfehler auf:

%Vor%

Verschieben Sie die folgende Zeile vor dem Aufruf super.init :

%Vor%

gibt den folgenden Fehler:

%Vor%

Die Eigenschaft ' panGestureRecognizer ' benötigt keine Mutation, daher muss sie als Konstante ' let ' deklariert werden. Da es eine Konstante ist, muss es bei der Deklaration einen Anfangswert haben oder es in der Methode init initialisieren. Um es zu initialisieren, muss " self " im Parameter " target " übergeben werden.

Ein anderer Thread hat vorgeschlagen, ihn als implizit nicht ausgepackt optional zu deklarieren und nach dem Aufruf super.init zu initialisieren. Dies hat bisher funktioniert, bis ich auf Xcode 6.3 aktualisiert habe.

Kennt jemand eine ordnungsgemäße Implementierung oder eine Problemumgehung für diesen Fall?

    
Pette 14.04.2015, 15:46
quelle

4 Antworten

12

Das Problem

Das Problem ist die Verwendung von let - Optionals, die als let deklariert sind, erhalten keinen Standardwert von nil ( var ist jedoch). Das Folgende, eingeführt in Swift 1.2, wäre sonst nicht gültig, da Sie myOptional nach der Deklaration nicht angeben könnten:

%Vor%

Daher erhalten Sie den Fehler 'Property' self.panGestureRecognizer 'nicht initialisiert bei super.init call', bevor Sie super.init(coder: aDecoder) aufrufen, weil panGestureRecognizer nicht nil ; es wurde überhaupt nicht initialisiert.

Die Lösungen:

1. Deklarieren Sie panGestureRecognizer als var , was bedeutet, dass es den Standardwert nil erhält, den Sie nach dem Aufruf von super.init(coder: aDecoder) ändern können.

2. Meiner Meinung nach die bessere Lösung: Verwenden Sie kein implizit unwrapped optionales Element und deklarieren Sie panGestureRecognizer mit einem Anfangswert von UIPanGestureRecognizer() . Dann setze das Ziel, nachdem super.init aufgerufen wurde:

%Vor%     
ABakerSmith 14.04.2015, 15:57
quelle
4

Sie können self nur verwenden, wenn die Klasse initialisiert ist. Und wenn Sie self für die Property-Initialisierung verwenden möchten, muss es lazy sein. Aber lazy wird nicht unterstützt für let , nur var .

Das liegt daran,

  

Sie müssen immer eine faule Eigenschaft als Variable deklarieren (mit der Var   Schlüsselwort), weil der Anfangswert möglicherweise erst danach abgerufen wird   Instanzinitialisierung ist abgeschlossen. Konstante Eigenschaften müssen immer   habe einen Wert vor der Initialisierung abgeschlossen und kann daher nicht sein   als faul deklariert.

Es ist eine Art Kompromiss und wenn Sie mit privaten Setter leben können, können Sie dies tun:

%Vor%

Oder initialisieren Sie panGestureRecognizer mit nur UIPanGestureRecognizer() und fügen Sie das Ziel später hinzu.

    
robertvojta 14.04.2015 16:01
quelle
3

Eine Umgehung für diesen speziellen Fall wäre:

%Vor%

}

    
Mike Pollard 14.04.2015 16:01
quelle
0

Wenn Sie selbst an den Initialisierer eines Objekts übergeben möchten, sollten Sie Ihr Objekt als faul deklarieren. Wenn dieses Objekt initialisiert wird, ist Self noch nicht bereit.

%Vor%     
wzbozon 31.01.2018 12:39
quelle

Tags und Links