Warum privat (set) in Swift nicht funktioniert?

8

Von Apple-Dokumentation:

  

"Jeder Zugriffsebenenmodifikator oben akzeptiert optional einen einzelnen   Argument, das aus dem in Klammern eingeschlossenen Schlüsselwortsatz besteht   (zum Beispiel, privat (setzen)). Verwenden Sie diese Form einer Zugriffsebene   Modifikator, wenn Sie eine Zugriffsebene für den Setter von a angeben möchten   Variable oder Index, die kleiner oder gleich der Zugriffsebene von ist   die Variable oder der Index selbst, wie in Getters und   Setzer. "

     

Auszug aus: Apple Inc. "Die schnelle Programmiersprache." iBooks.    Ссылка

Ein Beispiel, das ich in Playground testen möchte:

%Vor%

Ein Fehler, den ich in der Konsolenausgabe bekomme:

%Vor%

Was mache ich falsch? Fehle ich etwas?

PS1

Dieses Beispiel funktioniert gut:

%Vor%

Mehr aus der Dokumentation:

  

"Die Zugriffsebene für die Eigenschaft numberOfEdits ist mit a gekennzeichnet   private (set) Modifikator, um anzugeben, dass die Eigenschaft einstellbar sein soll   nur aus der gleichen Quelldatei wie die TrackedString-Struktur   Definition. "

     

Auszug aus: Apple Inc. "Die schnelle Programmiersprache." iBooks.    Ссылка

Aber das ist nicht was ich brauche. Ist es nicht möglich, variable numberOfEdits außerhalb der Struktur / Klasse zu setzen?

    
AndrewShmig 01.08.2014, 07:55
quelle

1 Antwort

11

Ihr Problem liegt hier:

%Vor%

Sie legen den Wert einer berechneten Eigenschaft in einem eigenen Setter fest. Dies verursacht eine unendliche Rekursion. Vergessen Sie nicht, dass dies eine berechnete Eigenschaft ist: Sie hat eigentlich keinen Speicher. Sie haben keine Variable "self.name", um etwas hineinzulegen; Sie haben nur ein paar Funktionen, um es zu berechnen. Berechnete Eigenschaften wie diese sollten andere, nicht berechnete Variablen für den Speicher verwenden. (Aus diesem Grund funktioniert Ihr Strukturbeispiel übrigens: Sie verwenden eine echte Eigenschaft mit Speicher.)

Es wird dir beim Debuggen nicht geholfen, wenn du auf einem Spielplatz rennst. Versteh mich nicht falsch: Spielplätze sind großartig. In diesem Fall dauert es jedoch einige Sekunden, bis der Absturz auftritt, so dass der Absturz wahrscheinlich nicht angezeigt wird, wenn Sie nach einer Bearbeitung erwarten. Es zeigt Ihnen auch keinen vollständigen Stack-Trace (was für das Problem, das Sie bekommen, massiv ist, weil es in einer "echten" App reproduziert wurde und es vielleicht deutlicher gemacht hätte, dass Sie den Stack geblasen haben.) Wenn ich gebaut und lief das oben als eine Konsolen-App, es blies schließlich mit einem Stack-Trace 104.832 Anrufe tief, alle bis auf zwei davon waren ...private_cmd.A.name.setter... . Ein bisschen Ahnung:)

    
Matt Gibson 01.08.2014, 09:20
quelle

Tags und Links