Die folgende Klasse hat die Eigenschaft ' let
', die als implizit unverpackte Variable deklariert ist. Dies hat zuvor mit Xcode 6.2 funktioniert:
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
:
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?
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:
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:
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.