Ich verstehe, wie "!" oder "?" funktioniert. Aber ich bin nicht ganz sicher, was der Zusatznutzen im Vergleich zu! = Keine Überprüfung ist. Welchen zusätzlichen Nutzen bringt der Wechsel zu "!?"? Ich glaube, es ist nur etwas, das Apple hinzugefügt hat, aber ich kann den zusätzlichen Vorteil im Vergleich zum Status quo von iOS nicht wirklich sehen. Fehle ich hier etwas? Vielen Dank im Voraus.Swift, optionale Wrapper. "?" "!" Ich verstehe, wie es funktioniert. Aber warum ist es besser als! = Keine Überprüfung
Antwort
Der Unterschied zwischen dem Überprüfen auf Null und dem Erfordernis eines optionalen Auspackens kann den Unterschied zwischen dem Absturz Ihres Codes ausmachen oder nicht. Optionale können bei korrekter Verwendung beide die Sicherheit erhöhen und Ihren Code lesbarer machen.
Angenommen, Sie haben ein Array und möchten den ersten Wert herausholen. Man könnte es wie folgt tun:
if !arr.isEmpty {
useValue(arr[0])
}
Aber natürlich ist es einfach, dass isEmpty
Teil zu vergessen, und wenn Sie das tun, wird abstürzen Ihren Code mit einer Out-of-bounds Fehler.
So intead, gibt es eine viel bessere Möglichkeit: die first
Methode des Arrays verwenden, die eine optional mit nil
zurückgibt, wenn das Array leer ist:
if let val = arr.first {
useValue(val)
}
Mit diesem Formular können Sie nicht dies falsch. Es ist unmöglich, den Wert arr. first
zu verwenden, ohne ihn auszupacken. Wenn Sie dies vergessen, erhalten Sie einen Kompilierungsfehler. Es ist auch besser lesbar zu meinen Augen/
Vermutlich würden Sie Ihre != nil
Formulierung erwarten, so etwas zu arbeiten:
if arr.first != nil {
// all optionals would be “implicit”
useValue(arr.first)
}
beiseite Putting, dass Sie .first
zweimal sind aufrufen, die ein bisschen ineffizient ist, und die Frage von Typ Kompatibilität, im Wesentlichen das landet Sie zurück auf Platz eins - Sie könnten vergessen, die nil
Vergleich zu tun, und dann Kaboom. Oder Sie könnten den Objective-C-Ansatz wählen und sagen, nil
ist in Ordnung, Nachrichten zu senden - aber das führt auch zu allerlei Verwirrung (persönlich hasse ich die Idee eines impliziten Sendens von Nachrichten an nil bedeutet no-op), und auch führt zu der Frage, was tun Sie, wenn die Funktion einen Werttyp wie Int
zurückgibt. Muss alles nullfähig sein? Dies führt zu viel Chaos im Obj-C-Land.
Was mehr ist, gibt es alle Arten von Annehmlichkeiten, die Sie einführen können, wenn Sie mit Extras zu tun haben, wie zum Beispiel Null-Koaleszenz:
// default to 0 if no first element
arr.first ?? 0
// much neater than this equivalent form:
arr.first != nil ? arr.first : 0
oder optional Vergleich:
// will only be true if arr is non-nil and zero
if arr.first == 0 {
}
Weitere Beispiele this answer
Vielleicht etwas, was du nicht über das Null-Verschmelzen weißt: In objective-c ist es nicht viel anders. Der "wahre" Parameter kann verpasst werden, um einen etwas anderen Syntax-Koaleszenzoperator zu bilden. z.B. 'id element = array [0]?: defaultValue;' –
Warum kannst du nicht einfach 'id first = arr.first; if (first! = nil) {...} in Objective-C? Dann wird es nicht zweimal zuerst anrufen. Wenn Sie Software freigeben, testen Sie, um sicherzustellen, dass sie während der Entwicklung nicht abstürzt. Wenn dies der Fall ist, beheben Sie sie während der Entwicklung. Zu der Zeit, wenn Sie die Release-Phase erreichen, ist Ihr Code ziemlich zuversichtlich, ohne eine Menge von "wenn Let var = etwas {...}" Ihre Methoden verunreinigt, so dass Ihre objektiven c Methoden schön und kurz sind. – Zhang
Der ?
Betreiber ist sehr praktisch, wenn es um die Verkettungs kommt, zum Beispiel:
a?.b?.c?.doSomething()
Andernfalls würden Sie a
überprüfen müssen, b
und c
für nil
, die in mehr unlesbaren Code führen kann als Verkettungs tut .
Eine andere Sache ist, dass Sie einfach Argumente markieren können, die optional sind, z.
func someFunc(arg: Type?)
und es ist sofort klar, dass dies ein Typ ist, der nil
sein kann, das heißt, die Sprache dies erzwingt. Sonst würden Sie etwas passieren, das nil
sein könnte, und Sie vergessen die Überprüfung und erleben Abstürze.
Ah, komm schon ... ein Downvote ?! –
Ich glaube nicht, dass jemand Ihre Antwort abgelehnt hat. Es ist eine wirklich gute Antwort. Vielen Dank!! – shle2821
@ shle2821, sombody hat. Wenn Sie genug Punkte bekommen, erhalten Sie das Privileg, die Upvote- und Down-Stimmen getrennt zu sehen. –
Warum sollte ich jedes Mal, wenn ich eine Variable verwende, nach nil suchen, wenn ich sie als nicht-optional deklarieren kann und sicher sein kann, dass sie nie null sein wird? –
Es ist mehr eine praktische Eigenschaft, um einen kürzeren und besser lesbaren Code zu schreiben. Es ist nicht typisch für Swift, aber auch in anderen Sprachen wie Groovy verfügbar. –