Was bedeutet es, "die Instanz auszupacken"? Warum ist es notwendig?
Soweit ich trainieren kann (das ist auch für mich sehr neu) ...
Der Begriff "verpackt" impliziert, dass wir uns eine optionale Variable als Geschenk vorstellen sollten, eingewickelt in glänzendes Papier, das (leider!) Leer sein könnte .
Beim "Umschließen" ist der Wert einer optionalen Variablen eine Aufzählung mit zwei möglichen Werten (ähnlich einem Booleschen Wert). Diese Aufzählung beschreibt, ob die Variable einen Wert ( Some(T)
) enthält oder nicht ( None
).
Wenn es einen Wert gibt, kann dies durch "Auspacken" der Variablen (Erhalten des T
von Some(T)
) erhalten werden.
Wie john!.apartment = number73
unterscheidet sich von john.apartment = number73
? (Umschrieben)
Wenn Sie den Namen einer optionalen Variablen (z. B. Text john
ohne !
) schreiben , bezieht sich dies auf die "umschlossene" Aufzählung (Some / None) und nicht auf den Wert selbst (T). Ist john
also keine Instanz von Person
und hat kein apartment
Mitglied:
john.apartment
// 'Person?' does not have a member named 'apartment'
Der tatsächliche Person
Wert kann auf verschiedene Arten ausgepackt werden:
- "Forced Unwrapping":
john!
(gibt den Person
Wert an, falls vorhanden, Laufzeitfehler, wenn er Null ist)
- "optionale Bindung":
if let p = john { println(p) }
(führt aus, println
wenn der Wert vorhanden ist)
- "optionale Verkettung":
john?.learnAboutSwift()
(führt diese erfundene Methode aus, wenn der Wert vorhanden ist)
Ich denke, Sie wählen eine dieser Möglichkeiten zum Auspacken, je nachdem, was im Fall Null passieren soll und wie wahrscheinlich das ist. Dieses Sprachdesign zwingt dazu, den Null-Fall explizit zu behandeln, was meiner Meinung nach die Sicherheit gegenüber Obj-C verbessert (wo man leicht vergisst, den Null-Fall zu behandeln).
Update :
Das Ausrufezeichen wird auch in der Syntax zum Deklarieren von "Implizit entpackten Optionen" verwendet.
In den bisherigen Beispielen wurde die john
Variable als deklariert var john:Person?
und ist optional. Wenn Sie den tatsächlichen Wert dieser Variablen möchten, müssen Sie ihn mit einer der drei oben genannten Methoden auspacken.
Wenn es var john:Person!
stattdessen als deklariert würde, wäre die Variable eine implizit nicht verpackte Option (siehe den Abschnitt mit dieser Überschrift in Apples Buch). Diese Art von Variable muss beim Zugriff auf den Wert nicht entpackt werden und john
kann ohne zusätzliche Syntax verwendet werden. Aber Apples Buch sagt:
Implizit entpackte Optionen sollten nicht verwendet werden, wenn die Möglichkeit besteht, dass eine Variable zu einem späteren Zeitpunkt Null wird. Verwenden Sie immer einen normalen optionalen Typ, wenn Sie während der Lebensdauer einer Variablen nach einem Nullwert suchen müssen.
Update 2 :
Der Artikel " Interessante schnelle Funktionen " von Mike Ash gibt einige Motivation für optionale Typen. Ich finde es toll, klar zu schreiben.
Update 3 :
Ein weiterer nützlicher Artikel über die implizit ausgepackte optionale Verwendung des Ausrufezeichens: " Swift and the Last Mile " von Chris Adamson. Der Artikel erklärt, dass dies eine pragmatische Maßnahme von Apple ist, mit der die von den Objective-C-Frameworks verwendeten Typen deklariert werden, die möglicherweise Null enthalten. Das Deklarieren eines Typs als optional (Verwenden ?
) oder implizit ausgepackt (Verwenden !
) ist "ein Kompromiss zwischen Sicherheit und Komfort". In den Beispielen im Artikel hat Apple beschlossen, die Typen als implizit entpackt zu deklarieren, um den aufrufenden Code bequemer, aber weniger sicher zu machen.
Vielleicht könnte Apple in Zukunft ihre Frameworks durchkämmen, um die Unsicherheit implizit entpackter ("wahrscheinlich nie null") Parameter zu beseitigen und sie durch optionale ("könnte sicherlich keine besonderen [hoffentlich dokumentierten!] Umstände sein") oder Standard-Nicht-Umstände zu ersetzen -optionale ("ist niemals null") Deklarationen, basierend auf dem genauen Verhalten ihres Objective-C-Codes.
Folgendes ist meiner Meinung nach der Unterschied:
Bedeutet, John kann Null sein
Der Compiler interpretiert diese Zeile wie folgt:
Während
Der Compiler interpretiert diese Zeile wie folgt:
Daher mit! wird die if-Anweisung auspacken und schneller ausführen, aber wenn john null ist, tritt ein Laufzeitfehler auf.
Wrap bedeutet hier nicht, dass es sich um Speicher handelt, sondern um Code, in diesem Fall um eine if-Anweisung. Da Apple die Leistung zur Laufzeit genau beachtet, möchten sie Ihnen einen Weg dazu bieten Lassen Sie Ihre App mit der bestmöglichen Leistung laufen.
Aktualisieren:
Zurück zu dieser Antwort nach 4 Jahren, da ich in Stackoverflow den höchsten Ruf davon hatte :) Ich habe die Bedeutung des Auspackens zu dieser Zeit ein wenig falsch verstanden. Jetzt, nach 4 Jahren, glaube ich, dass das Entpacken hier bedeutet, den Code von seiner ursprünglichen kompakten Form zu erweitern. Es bedeutet auch, die Unbestimmtheit um dieses Objekt herum zu entfernen, da wir per Definition nicht sicher sind, ob es null ist oder nicht. Betrachten Sie es genau wie die Antwort von Ashley oben als ein Geschenk, das nichts enthalten könnte. Aber ich denke immer noch, dass das Entpacken Code-Entpacken ist und nicht speicherbasiertes Entpacken wie das Verwenden von Enum.
quelle
TL; DR
Was bedeutet ein Ausrufezeichen in der Swift-Sprache?
Beispiel
Quelle: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_399
quelle
let f: String! = "hello"
und dannprint(f)
ist der AusgangOptional("hello")
statt nur"hello"
.Wenn John eine optionale Var wäre (so deklariert)
dann wäre es möglich, dass John keinen Wert hat (im ObjC-Sprachgebrauch kein Wert)
Das Ausrufezeichen sagt dem Compiler im Grunde: "Ich weiß, dass dies einen Wert hat, Sie müssen nicht darauf testen." Wenn Sie es nicht verwenden möchten, können Sie es unter bestimmten Bedingungen testen:
Das Innere davon wird nur ausgewertet, wenn John einen Wert hat.
quelle
“let possibleString: String? = "An optional string." println(possibleString!) // requires an exclamation mark to access its value // prints "An optional string.”
Aber es funktioniert gut mit no! Hier scheint etwas seltsam.John?
und esJohn
gibt zwei verschiedene Typen. Eine ist vom Typ Optionale Person und die andere vom Typ Person. Die optionale Person muss ausgepackt werden, bevor Sie die Person herausholen können. Aber wie Sie sagen, scheint dies zumindest unter diesen Umständen zu geschehen, ohne dass Sie tatsächlich etwas tun müssen. Das scheint das zu machen! redundant. Es sei denn, die ! ist IMMER optional, wird jedoch empfohlen, um Fehler bei der Kompilierung abzufangen. Ein bisschen wie das Zuweisen von Vars / Lets zu einem bestimmten Typ kann explizit sein,let John: Person = ...
aber auch abgeleitet werdenlet John = ...
.Einige Gesamtperspektiven, um die anderen nützlichen, aber detaillierteren Antworten zu ergänzen:
In Swift wird das Ausrufezeichen in mehreren Kontexten angezeigt:
let name = nameLabel!.text
var logo: UIImageView!
logo.image = thing as! UIImage
try! NSJSONSerialization.JSONObjectWithData(data, [])
Jedes von diesen ist ein anderes Sprachkonstrukt mit einer anderen Bedeutung, aber alle haben drei wichtige Dinge gemeinsam:
1. Ausrufezeichen umgehen die Sicherheitsüberprüfungen zur Kompilierungszeit von Swift.
Wenn Sie
!
in Swift verwenden, sagen Sie im Wesentlichen: "Hey, Compiler, ich weiß, dass Sie denken , dass hier ein Fehler auftreten könnte , aber ich weiß mit absoluter Sicherheit, dass dies niemals der Fall sein wird."Nicht jeder gültige Code passt in das Feld des Swift-Typsystems zur Kompilierungszeit - oder in die statische Typprüfung einer Sprache. Es gibt Situationen, in denen Sie logisch beweisen können, dass ein Fehler niemals auftreten wird, aber Sie können ihn dem Compiler nicht beweisen . Aus diesem Grund haben die Designer von Swift diese Funktionen in erster Linie hinzugefügt.
Wenn Sie jedoch verwenden
!
, schließen Sie einen Wiederherstellungspfad für einen Fehler aus, was bedeutet, dass…2. Ausrufezeichen sind mögliche Abstürze.
Ein Ausrufezeichen lautet außerdem: "Hey Swift, ich bin mir so sicher, dass dieser Fehler niemals auftreten kann, dass es für Sie besser ist, meine gesamte App zum Absturz zu bringen, als für mich, einen Wiederherstellungspfad dafür zu codieren."
Das ist eine gefährliche Behauptung. Es kann das Richtige sein: In geschäftskritischem Code, in dem Sie über die Invarianten Ihres Codes nachgedacht haben, kann es sein, dass eine falsche Ausgabe schlechter ist als ein Absturz.
Wenn ich jedoch
!
in freier Wildbahn sehe , wird es selten so achtsam verwendet. Stattdessen bedeutet es zu oft: "Dieser Wert war optional und ich habe nicht wirklich darüber nachgedacht, warum es Null sein könnte oder wie ich mit dieser Situation richtig umgehen soll, aber durch Hinzufügen!
wurde es kompiliert ... also ist mein Code korrekt, oder?"Passen Sie auf die Arroganz des Ausrufezeichens auf. Stattdessen…
3. Ausrufezeichen werden am besten sparsam verwendet.
Jedes dieser
!
Konstrukte hat ein?
Gegenstück, das Sie zwingt, sich mit dem Fehler / Null-Fall zu befassen:if let name = nameLabel?.text { ... }
var logo: UIImageView?
logo.image = thing as? UIImage
try? NSJSONSerialization.JSONObjectWithData(data, [])
Wenn Sie versucht sind, zu verwenden
!
, ist es immer gut, sorgfältig zu überlegen, warum Sie nicht?
stattdessen verwenden. Ist ein Absturz Ihres Programms wirklich die beste Option, wenn der!
Vorgang fehlschlägt? Warum ist dieser Wert optional / fehlgeschlagen?Gibt es einen vernünftigen Wiederherstellungspfad, den Ihr Code im Fall Null / Fehler einschlagen könnte? Wenn ja, codieren Sie es.
Wenn es unmöglich Null sein kann, wenn der Fehler niemals auftreten kann, gibt es dann eine vernünftige Möglichkeit, Ihre Logik zu überarbeiten, damit der Compiler das weiß? Wenn ja, mach es; Ihr Code ist weniger fehleranfällig.
Es gibt Zeiten, in denen es keinen vernünftigen Weg gibt, einen Fehler zu behandeln, und das einfache Ignorieren des Fehlers - und damit das Vorgehen mit falschen Daten - wäre schlimmer als ein Absturz. Dies sind die Zeiten, in denen Gewalt ausgepackt wird.
Ich durchsuche regelmäßig meine gesamte Codebasis
!
und überprüfe jede Verwendung davon. Nur sehr wenige Verwendungen halten einer Prüfung stand. (Zum jetzigen Zeitpunkt enthält das gesamte Siesta-Framework genau zwei Instanzen .)Das heißt nicht, dass Sie Ihren Code niemals verwenden sollten
!
- nur, dass Sie ihn achtsam verwenden und ihn niemals zur Standardoption machen sollten.quelle
func isSubscriptionActive(receiptData: NSDictionary?) -> Bool { if(receiptData == nil) { return false; } return (hasValidTrial(receiptData!) || isNotExpired(receiptData!)) && isNotCancelled(receiptData!) }
Angesichts 3. gibt es einen besseren Weg, um es zu schreiben?func isSubscriptionActive(receiptData: NSDictionary?) -> Bool { guard let nonNilReceiptData = receiptData else { return false} return (hasValidTrial(nonNilReceiptData) || isNotExpired(nonNilReceiptData)) && isNotCancelled(nonNilReceiptData) }
john
ist optionalvar
. Kann also einennil
Wert enthalten. Um sicherzustellen, dass der Wert nicht gleich Null ist, verwenden Sie a!
am Ende desvar
Namens.Aus der Dokumentation
„Wenn Sie sicher sind, dass die Option einen Wert enthält, können Sie auf den zugrunde liegenden Wert zugreifen, indem Sie am Ende des Namens der Option ein Ausrufezeichen (!) Einfügen. Das Ausrufezeichen sagt effektiv: „Ich weiß, dass dieses optionale definitiv einen Wert hat; bitte benutze es. "
Eine andere Möglichkeit, den Wert ungleich Null zu überprüfen, ist
quelle
john.apartment = number73
auch gesagt wird: "Ich weiß, dass dieses optionale definitiv einen Wert hat; bitte verwenden Sie es." ...Hier sind einige Beispiele:
Wo
word
ist ein optionaler Wert. bedeutet, dass es einen Wert enthalten kann oder nicht.Hier
name
hat ein Wert, damit wir ihn zuweisen könnenWenn
dog
gewaltsam ausgepackt wird, muss es einen Wert enthaltenDie Anwendung stürzt ab, da wir nicht
nil
ausgepackt zugewiesen sindquelle
var c:Int = nil
wird erhalten: "Nil kann den angegebenen Typ 'int' nicht initialisieren"In diesem Fall...
var John: Person!
es bedeutet, dass John anfangs keinen Wert hat, er wird gesetzt und wenn er einmal gesetzt ist, wird er nie wieder null geführt. Daher kann ich der Einfachheit halber die einfachere Syntax für den Zugriff auf eine optionale Variable verwenden, da dies eine "implizit entpackte Option" ist.
quelle
Wenn Sie aus einer Sprache der C-Familie stammen, denken Sie "Zeiger auf ein Objekt vom Typ X, bei dem es sich möglicherweise um die Speicheradresse 0 (NULL) handelt", und wenn Sie aus einer dynamisch typisierten Sprache stammen, werden Sie es sein Denken "Objekt, das wahrscheinlich vom Typ X ist, aber vom Typ undefiniert sein könnte". Keines davon ist tatsächlich richtig, obwohl das erste auf Umwegen nahe ist.
Sie sollten sich das so vorstellen, als wäre es ein Objekt wie:
Wenn Sie Ihren optionalen Wert
foo == nil
damit testen, dass er wirklich zurückkehrtfoo.isNil
, und wenn Sie sagen,foo!
dass erfoo.realObject
mit der Behauptung zurückkehrt, dassfoo.isNil == false
. Es ist wichtig, dies zu beachten, denn wenn diesfoo
tatsächlich Nullfoo!
ist, ist dies ein Laufzeitfehler. Daher möchten Sie normalerweise stattdessen eine bedingte Erlaubnis verwenden, es sei denn, Sie sind sich sehr sicher, dass der Wert nicht Null ist. Diese Art von Trick bedeutet, dass die Sprache stark typisiert werden kann, ohne dass Sie testen müssen, ob die Werte überall gleich Null sind.In der Praxis verhält es sich nicht wirklich so, weil die Arbeit vom Compiler erledigt wird. Auf hoher Ebene gibt es einen Typ,
Foo?
der von getrenntFoo
ist und Funktionen verhindert, die Typ akzeptierenFoo
erhalten. Auf einer niedrigen Ebene ist ein optionaler Wert jedoch kein echtes Objekt, da er keine Eigenschaften oder Methoden hat. Es ist wahrscheinlich, dass es sich tatsächlich um einen Zeiger handelt, der beim Force-Entpacken NULL (0) mit dem entsprechenden Test verwenden kann.Es gibt eine andere Situation, in der ein Ausrufezeichen auf einem Typ angezeigt wird, wie in:
Dies entspricht in etwa der Annahme einer Option mit erzwungenem Auspacken, dh:
Sie können dies verwenden, um eine Methode zu haben, die technisch einen optionalen Wert akzeptiert, aber einen Laufzeitfehler aufweist, wenn er Null ist. In der aktuellen Version von Swift wird die is-not-nil-Behauptung anscheinend umgangen, sodass stattdessen ein Fehler auf niedriger Ebene auftritt. Im Allgemeinen keine gute Idee, aber es kann nützlich sein, wenn Code aus einer anderen Sprache konvertiert wird.
quelle
Das ! bedeutet, dass Sie das Objekt zwangsweise auspacken! folgt. Weitere Informationen finden Sie in der Apples-Dokumentation, die Sie hier finden: https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/TheBasics.html
quelle
Wenn Sie mit C # vertraut sind, ähnelt dies nullbaren Typen, die ebenfalls mit einem Fragezeichen deklariert werden:
Das Ausrufezeichen entspricht in diesem Fall dem Zugriff auf die .Value-Eigenschaft des nullbaren Typs wie folgt:
quelle
In Ziel C waren Variablen ohne Wert gleich 'nil' (es war auch möglich, 'nil'-Werte wie 0 und false zu verwenden), daher war es möglich, Variablen in bedingten Anweisungen zu verwenden (Variablen mit Werten sind gleich' TRUE ' 'und diejenigen ohne Werte waren gleich' FALSE ').
Swift bietet Typensicherheit durch Bereitstellung eines optionalen Werts. Das heißt, es verhindert, dass Fehler entstehen, die Variablen unterschiedlichen Typs zuweisen.
In Swift können also nur Boolesche Werte für bedingte Anweisungen bereitgestellt werden.
Obwohl 'hw' eine Zeichenfolge ist, kann sie hier nicht in einer if-Anweisung wie in Ziel C verwendet werden.
Dafür muss es erstellt werden als,
quelle
Das ! Am Ende eines Objekts steht, dass das Objekt optional ist und ausgepackt werden soll, wenn es sonst eine Null zurückgeben kann. Dies wird häufig verwendet, um Fehler abzufangen, die das Programm sonst zum Absturz bringen würden.
quelle
Kurz (!): Nachdem Sie eine Variable deklariert haben und sicher sind, dass die Variable einen Wert enthält.
sonst müssten Sie dies bei jedem nach Übergabe des Wertes tun ...
quelle
John ist eine optionale Person, was bedeutet, dass sie einen Wert enthalten oder Null sein kann.
wird verwendet, wenn John nicht optional ist. Da John niemals Null ist, können wir sicher sein, dass die Wohnung nicht mit Null bewertet wird. Während
verspricht dem Compiler, dass John nicht gleich Null ist, packt dann die Option aus, um Johns Wert zu erhalten, und greift auf Johns Apartment-Eigentum zu. Verwenden Sie dies, wenn Sie wissen, dass John nicht Null ist. Wenn Sie dies mit null optional aufrufen, wird ein Laufzeitfehler angezeigt.
Die Dokumentation enthält ein schönes Beispiel für die Verwendung, wobei convertNumber optional ist.
quelle
john.apartment = number73
, das NICHT zu einem Fehler führt, es sei denn, ich setze ein '!' nach john?john
optionale dereferenziere , dem Compiler nicht, dass es nicht Null sein muss? ... Und in Ihremvar jack: Person = john!
Beispiel fehlt nicht das? Nach Person dem Compiler mitteilen, dass Siejohn
nicht null sein müssen? Insgesamt!
scheint das nur irgendwie überflüssig zu sein ... Es fühlt sich immer noch so an, als würde mir etwas im "Warum" von!
...Um es einfach auszudrücken: Ausrufezeichen bedeuten, dass eine Option ausgepackt wird. Eine Option ist eine Variable, die einen Wert haben kann oder nicht. Sie können also mithilfe einer if let-Anweisung wie hier gezeigt überprüfen, ob die Variable leer ist , und dann das Entpacken erzwingen. Wenn Sie das Entpacken einer leeren Option erzwingen, stürzt Ihr Programm ab. Seien Sie also vorsichtig! Optionale Optionen werden deklariert, indem am Ende einer expliziten Zuweisung zu einer Variablen ein Fragezeichen gesetzt wird. Ich könnte beispielsweise Folgendes schreiben:
Diese Variable hat keinen Wert. Wenn ich es auspacken würde, würde das Programm abstürzen und Xcode würde Ihnen sagen, dass Sie versucht haben, ein optionales mit dem Wert nil auszupacken.
Hoffe das hat geholfen.
quelle
IN EINFACHEN WORTEN
USING Das Ausrufezeichen gibt an, dass die Variable aus einem Wert ungleich Null bestehen muss (niemals Null).
quelle
Die gesamte Geschichte beginnt mit einer schnellen Funktion, die als optionale Vars bezeichnet wird. Dies sind die Variablen, die einen Wert haben können oder keinen Wert haben können. Im Allgemeinen erlaubt uns swift nicht, eine Variable zu verwenden, die nicht initialisiert ist, da dies zu Abstürzen oder unerwarteten Gründen führen kann und auch einen Platzhalter für Hintertüren dient. Um eine Variable zu deklarieren, deren Wert zunächst nicht bestimmt wurde, verwenden wir ein '?'. Wenn eine solche Variable deklariert wird, um sie als Teil eines Ausdrucks zu verwenden, muss sie vor der Verwendung entpackt werden. Das Entpacken ist eine Operation, durch die der Wert einer Variablen ermittelt wird. Dies gilt für Objekte. Wenn Sie versuchen, sie zu verwenden, wird beim Kompilieren ein Fehler beim Kompilieren angezeigt. Um eine Variable zu entpacken, die eine optionale Variable ist, das Ausrufezeichen "!" wird genutzt.
Es gibt Zeiten, in denen Sie wissen, dass solchen optionalen Variablen beispielsweise vom System oder Ihrem eigenen Programm Werte zugewiesen werden, aber einige Zeit später, z. B. UI-Outlets, in einer solchen Situation, anstatt eine optionale Variable mit einem Fragezeichen "?" Zu deklarieren. wir gebrauchen "!".
Somit weiß das System, dass diese Variable, die mit "!" ist momentan optional und hat keinen Wert, wird aber später in seiner Lebensdauer einen Wert erhalten.
Das Ausrufezeichen enthält also zwei verschiedene Verwendungen: 1. Eine Variable deklarieren, die optional ist und definitiv später einen Wert erhält. 2. Eine optionale Variable auspacken, bevor sie in einem Ausdruck verwendet wird.
Die obigen Beschreibungen vermeiden hoffentlich zu viel technisches Zeug.
quelle
Wenn Sie es als optional verwenden, packt es das optionale aus und prüft, ob etwas vorhanden ist. Wenn Sie es in einer if-else-Anweisung verwenden, ist dies Code für NOT. Zum Beispiel,
quelle
Eine optionale Variable kann einen Wert enthalten oder nicht
Fall 1:
var myVar:String? = "Something"
Fall 2:
var myVar:String? = nil
Wenn Sie jetzt myVar! fragen, weisen Sie den Compiler an, einen Wert zurückzugeben, falls 1 zurückgegeben wird
"Something"
in Fall 2 wird es abstürzen.
Bedeutung! mark zwingt den Compiler, einen Wert zurückzugeben, auch wenn dieser nicht vorhanden ist. Deshalb der Name Force Unwrapping .
quelle
quelle
FRAG DICH SELBST
person?
einapartment
Mitglied / eine Eigenschaft? ODERperson
einapartment
Mitglied / eine Eigenschaft?Wenn Sie diese Frage nicht beantworten können, lesen Sie weiter:
Um dies zu verstehen, benötigen Sie möglicherweise ein grundlegendes Verständnis für Generika . Siehe hier . Viele Dinge in Swift werden mit Generics geschrieben. Optionale enthalten
Der folgende Code wurde in diesem Stanford-Video zur Verfügung gestellt . Sehr zu empfehlen, die ersten 5 Minuten zu sehen
Eine Option ist eine Aufzählung mit nur 2 Fällen
Optionale Bindung:
wenn du sagst
var john: Person?
meinst du eigentlich so:Hat die obige Aufzählung eine Eigenschaft namens
apartment
? Siehst du es irgendwo Es ist überhaupt nicht da! Wenn Sie es jedoch auspacken, dh tunperson!
, können Sie ... was es unter der Haube tut, ist:Optional<Person>.Some(Person(name: "John Appleseed"))
Hättest du statt definiert
var john: Person
:var john: Person?
dann hättest du das nicht mehr gebraucht!
, weil esPerson
selbst ein Mitglied von hatapartment
Eine zukünftige Diskussion darüber, warum
!
das Auspacken manchmal nicht empfohlen wird, finden Sie in diesen Fragen und Antwortenquelle