Seit Beta 8.3, zillionen Warnungen "String-Interpolation erzeugt eine Debug-Beschreibung für einen optionalen Wert; wollten Sie dies explizit machen?" erschien in meinem Code.
Beispielsweise wurde die Warnung in der folgenden Situation angezeigt, in der Optionen zu Null führen können:
let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"
Wie zuvor entworfen, war es für mich (und den Compiler) in Ordnung, die Optionen als 'Null' zu interpolieren. Aber der Compiler hat seine Meinung geändert.
Der Compiler schlägt vor, einen String-Konstruktor mit folgender Beschreibung hinzuzufügen:
let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"
Offensichtlich sind die Ergebnisse explizit, aber meiner Meinung nach auch sehr, sehr umständlich. Gibt es eine bessere Option? Muss ich all diese Warnungen korrigieren oder besser auf die nächste Beta warten?
swift
swift3
optional
string-interpolation
Stéphane de Luca
quelle
quelle
Swift 3
brach meine eigenelog
und ich machte einen Fehler, indem ichprint
stattdessen einfach benutzte . Sollte immer einen eigenen Wrapper erstellen, sonst werden Sie von dieser Art von "neuer Funktion" begeistert sein.Antworten:
Dies ist eine Änderung, die in dieser Pull-Anforderung vorgenommen wurde , da die Interpolation
Optional(...)
in die resultierende Zeichenfolge häufig unerwünscht ist und insbesondere in Fällen mit implizit entpackten Optionen überraschend sein kann . Die vollständige Diskussion dieser Änderung finden Sie auf der Mailingliste hier .Wie in der Pull-Request-Diskussion erwähnt (obwohl leider nicht von Xcode) - eine etwas schönere Möglichkeit, die Warnung zum Schweigen zu bringen als die Verwendung von,
String(describing:)
besteht darin, dem optionalen Typ von allem, was Sie interpolieren, eine Besetzung hinzuzufügen, zum Beispiel:Was auch verallgemeinert werden kann auf
as Optional
:In Swift 5 besteht eine weitere Option mit dem von SE-0228 eingeführten neuen String-Interpolationssystem darin, eine benutzerdefinierte
appendInterpolation
Überladung hinzuzufügen fürDefaultStringInterpolation
:Falls gewünscht, können Sie sogar die Argumentbezeichnung entfernen, um die Warnung vollständig innerhalb eines Moduls (oder innerhalb einer bestimmten Datei, wenn Sie sie als markieren
fileprivate
) zu deaktivieren :Ich persönlich würde es jedoch vorziehen, das Argumentetikett beizubehalten.
quelle
?? "nil"
Schweigen der Warnung, die sehr beliebt zu sein schien und daher in naher Zukunft in einem anderen Vorschlag auftauchen könnte. Ich bin damit einverstanden, dass diese Problemumgehung nicht ideal ist - ich persönlich halte es für ziemlich offensichtlich, dassOptional(...)
für eine starke Option eine Interpolation in die Zeichenfolge erwartet wird - es war wirklich nur der Fall von IUOs, die diese Warnung IMO benötigten. Aber Swift entwickelt sich ständig weiter, so dass sich dies später ändern kann. Aber im Moment haben wir es.guard result == nil else { print("result was \(result as Optional)") return }
if let
? dhif let result = result { print("result was \(result)"); return }
. Nicht alle vorzeitigen Rücksendungen müssen mit Wachen durchgeführt werden.Zwei einfachere Möglichkeiten, mit diesem Problem umzugehen.
Option 1:
Der erste wäre das "gewaltsame Auspacken" des Wertes, den Sie mit einem Knall (!) Zurückgeben möchten.
Ausgabe:
Option 2:
Der andere Weg, der der bessere sein könnte, besteht darin, den zurückgegebenen Wert "sicher auszupacken" .
Ausgabe:
Würde empfehlen, mit Option 2 zu gehen.
Tipp: Vermeiden Sie nach Möglichkeit das gewaltsame Auspacken (!), Da wir nicht sicher sind, ob wir immer den Wert zum Auspacken haben werden.
quelle
Die Verwendung von String (Beschreibung: optional) scheint am einfachsten zu sein.
Standardwert ?? macht keinen Sinn für Nicht-Strings, zB Int.
Wenn Int nil ist, soll im Protokoll 'nil' angezeigt werden, nicht standardmäßig ein anderes Int, z. B. 0.
Einige zu testende Spielplatzcodes:
Ausgabe
quelle
Nach dem Update auf Xcode 8.3 und vielen Warnmeldungen habe ich Folgendes gefunden, das eher dem ursprünglichen Ausgabeverhalten ähnelt, das einfach hinzuzufügen ist und die Ausführlichkeit der Verwendung von "String (description :)" sowohl im Code als auch in der Ausgabe verringert .
Fügen Sie grundsätzlich eine optionale Erweiterung hinzu, die eine Zeichenfolge enthält, die das Element im optionalen Element beschreibt, oder einfach "nil", wenn sie nicht festgelegt ist. Wenn das optionale Element ein String ist, setzen Sie es in Anführungszeichen.
Und Verwendung auf einem Spielplatz:
Vielen Dank für die Hilfe von folgendem Link:
Überprüfen Sie, ob die Variable eine optionale und welche Art von Wraps ist
quelle
a?.b?.c.orNil
.Siehe Ole Begemans Fix dafür . Ich liebe es. Es wird ein
???
Operator erstellt, den Sie dann folgendermaßen verwenden können:quelle
Doppelklicken Sie auf das gelbe Dreieck in der Zeile mit dieser Warnung. Dies zeigt FixIt mit zwei Lösungen.
Verwenden Sie
String(describing:)
diese Option , um diese Warnung zum Schweigen zu bringen:Mit diesem wird es werden
String(describing:<Variable>)
Z.B. ::
String(describing: employeeName)
Geben Sie a ein
default value
, um diese Warnung zu vermeiden:Mit diesem wird es werden
(<Variable> ?? default value)
Z.B.:
employeeName ?? “Anonymous” as! String
quelle
Swift 5
Meine Lösung besteht darin, ein Objekt zum
extension
AuspackenOptional
zu erstellenAny
.Wenn Sie das Objekt protokollieren oder ausdrucken, können Sie das tatsächliche
object
oder<nil>⭕️
(Kombination aus Text und visuellem Zeichen) sehen. Dies ist besonders im Konsolenprotokoll hilfreich.quelle
Erstellen Sie eine Interpolationsmethode, die einen optionalen generischen Typ mit einem unbenannten Parameter akzeptiert. Alle Ihre nervigen Warnungen werden auf magische Weise verschwinden.
quelle