Beim Schreiben eines assert
in Swift ist mir aufgefallen, dass der erste Wert als eingegeben wird
@autoclosure() -> Bool
mit einer überladenen Methode, um einen generischen T
Wert zurückzugeben, um die Existenz über die zu testen LogicValue
protocol
.
Halten Sie sich jedoch strikt an die vorliegende Frage. Es scheint ein zu wollen @autoclosure
, das a zurückgibt Bool
.
Das Schreiben eines tatsächlichen Abschlusses, der keine Parameter akzeptiert und einen Bool zurückgibt, funktioniert nicht. Ich möchte den Abschluss aufrufen, damit er kompiliert wird, wie folgt:
assert({() -> Bool in return false}(), "No user has been set", file: __FILE__, line: __LINE__)
Das einfache Übergeben eines Bool funktioniert jedoch:
assert(false, "No user has been set", file: __FILE__, line: __LINE__)
Also, was ist los? Was ist @autoclosure
?
Bearbeiten: @auto_closure
wurde umbenannt@autoclosure
f({2 >1}())
f(2 > 1)
funktioniert. Anruff({2 > 1})
schlägt fehl miterror: function produces expected type 'Bool'; did you mean to call it with '()'?
. Ich habe es auf einem Spielplatz und mit dem Swift REPL getestet.func f(@autoclosure pred: () -> Bool)
Hier ist ein praktisches Beispiel - mein
print
Override (dies ist Swift 3):Wenn Sie sagen
print(myExpensiveFunction())
,print
überschattet mein Override Swiftsprint
und wird aufgerufen.myExpensiveFunction()
wird somit in einen Verschluss eingewickelt und nicht ausgewertet . Wenn wir uns im Release-Modus befinden, wird es nie ausgewertet, daitem()
es nicht aufgerufen wird. Daher haben wir eine Versionprint
, die ihre Argumente im Release-Modus nicht auswertet.quelle
myExpensiveFunction()
? Wenn Sie anstelle der automatischen Schließung die Funktion zum Drucken übergebenprint(myExpensiveFunction)
, welche Auswirkungen hätte dies? Vielen Dank.Beschreibung von auto_closure aus den Dokumenten:
Und hier ist das Beispiel, das Apple dazu verwendet.
Grundsätzlich bedeutet dies, dass Sie einen booleschen Ausdruck als erstes Argument anstelle eines Abschlusses übergeben und daraus automatisch einen Abschluss für Sie erstellen. Aus diesem Grund können Sie false an die Methode übergeben, da es sich um einen booleschen Ausdruck handelt, aber keinen Abschluss übergeben kann.
quelle
@auto_closure
hier eigentlich nicht verwenden müssen . Der Code funktioniert gut ohne :func simpleAssert(condition: Bool, message: String) { if !condition { println(message) } }
. Verwenden@auto_closure
Sie diese Option, wenn Sie ein Argument wiederholt auswerten müssen (z. B. wenn Sie einewhile
ähnliche Funktion implementiert haben ) oder wenn Sie die Auswertung eines Arguments verzögern müssen (z. B. wenn Sie einen Kurzschluss implementieren&&
).autoclosure
mit einerwhile
ähnlichen Funktion nennen? Ich scheine das nicht herauszufinden. Vielen Dank im Voraus.Dies zeigt einen nützlichen Fall von
@autoclosure
https://airspeedvelocity.net/2014/06/28/extending-the-swift-language-is-cool-but-be-careful/quelle
Es ist nur eine Möglichkeit, die geschweiften Klammern in einem Closure Call loszuwerden, einfaches Beispiel:
quelle
@autoclosure
ist ein Funktionsparameter, der eine gekochte Funktion (oder einen zurückgegebenen Typ)closure
akzeptiert, während ein General eine Rohfunktion akzeptiertSchauen wir uns ein Beispiel an
quelle