Schnelle schwache Lazy-Variable wird nicht kompiliert

7

Um dieses Problem zu demonstrieren, habe ich ein Vanille-Kakao-Projekt gemacht. Hier ist die AppDelegate.swift :

%Vor%

Xcode gibt Folgendes:

  

unbekannt: 0: Fehler: Kann den Rückgabewert des Typs 'NSNumber' nicht konvertieren (aka 'Optional') Geben Sie 'NSNumber' ein.

     

unbekannt: 0: kann keinen Wert vom Typ 'NSNummer?' um 'NSNummer ??' einzugeben.

     

unbekannt: 0: kann keinen Wert vom Typ 'NSNummer?' um 'NSNummer ??' einzugeben.

In meinem aktuellen Projekt ist es ein anderes Objekt von MyCustomClass (anstelle von NSNumber). Der Fehler ist identisch mit Ausnahme des Typs MyCustomClass .

Wenn ich weak oder lazy aus der Deklaration entferne, ist alles in Ordnung. Aber ich wollte die Referenzzählung von +1 speichern, da die MyCustomClass eine NSViewController ist, die sicher immer da ist.

Irgendeine Idee, wie man die schwache faule Variable benutzt?

    
LShi 03.07.2016, 16:24
quelle

4 Antworten

17

Schwach und faul vermischen sich nicht gut. Die Fehlermeldung ist völlig nutzlos um zu erklären, was vor sich geht, aber im Wesentlichen stimmen lazy und weak nicht überein:

  • lazy teilt Swift mit, dass Ihre Variable nicht bis zum ersten Zugriff erstellt werden soll, aber wenn sie einmal erstellt wurde, möchten Sie sie unbegrenzt für zukünftige Verweise behalten, während
  • weak teilt Swift mit, dass Sie nicht möchten, dass Ihre Variable der letzte Link ist, der die Freigabe Ihrer Variablen verhindert, was gegen das Ziel von lazy variables funktioniert.

Sie können dies lösen, indem Sie lazy emulieren, wie folgt:

%Vor%     
dasblinkenlight 03.07.2016, 17:04
quelle
4

Der Grund, warum "faul" und "schwach" nicht kompatibel sind, ist, dass jede Verwendung eine neue Instanz erstellen würde, wenn Sie nicht einen anderen Ort mit einer starken Referenz haben. Wenn Sie einen anderen Ort für eine starke Referenz haben, brauchen Sie nicht, dass Ihr Klassenmitglied derjenige ist, der die Instanz erstellt.

Nehmen wir an, wir haben:

%Vor%

Wenn Sie es das erste Mal verwenden, sagen wir, Sie verweisen es einfach in einem Funktionsaufruf irgendwo ...

%Vor%

In der nächsten Zeile ist myVariable wieder leer.

Warum ist das? Denn sobald myFunction beendet ist, gibt es keine Verweise mehr auf myVariable, und da es schwach ist, geht das entsprechende Objekt aus dem Geltungsbereich und verschwindet.

Es würde keinen Unterschied zwischen dieser faulen schwachen Variable und irgendeinem Funktionsaufruf-Ergebnis geben. Also, Ihre Variable kann auch eine Funktion oder eine berechnete Variable sein (was die Dinge für jeden, der Ihren Code betrachtet, klarer macht).

    
Alain T. 05.07.2016 02:47
quelle
0

versuche stattdessen eine schwache berechnete Eigenschaft zu verwenden ...

%Vor%

die dir das gewünschte Verhalten geben (wenn ich dich verstehe Frage: -))

%Vor%

wenn d nur einmal initialisiert werden muss, dann

%Vor%

das gibt Ihnen genau das, was Sie brauchen

%Vor%     
user3441734 03.07.2016 16:52
quelle
0

Der Ersteller eines Verweises muss nicht derjenige sein, der dafür verantwortlich ist, ihn zu behalten. Ich habe einige Klassen, die sich absichtlich behalten und selbst entscheiden, wann sie zurückgewonnen werden sollten, indem sie ihren starken Bezug auf sich selbst aufgeben.

Ich benutze eine andere Klasse als eine Fabrik wie diese. Manchmal muss ich die Argumente an den Konstruktor anpassen, damit diese generische Klasse mehr eine Vorlage als eine tatsächliche Implementierung ist. Aber während sie existieren, ist die Factory so konzipiert, dass sie die bereits vorhandene Instanz zurückgibt.

%Vor%

}

    
WeakPointer 21.12.2017 12:17
quelle