Ich AtomicBox
von Matt Gallagher CwlUtils in einem kleinen Countdown mit:Muting Schließung wird nicht kompiliert, wenn es komplizierter als eine Anweisung ist - wie zu beheben?
class Countdown {
private let counter: AtomicBox<Int>
init(from start: Int) {
self.counter = AtomicBox(start)
}
func countDown() {
self.counter.mutate { $0 -= 1 }
}
}
Das funktioniert ganz gut. Nun sage ich möchte einen Fehler werfen, wenn der Zähler bereits Null erreicht hat:
func countDown() throws {
self.counter.mutate {
guard $0 > 0 else {
throw MyError.alreadyZero
}
$0 -= 1
}
}
jetzt swift build
klagt: (. Weird-Fehlermeldung, nebenbei gesagt, sie kommen normalerweise schöner)
<unknown>:0: error: parameters may not have the 'var' specifier
<unknown>:0: error: build had 1 command failures
error: exit(1): /Applications/Xcode8.2/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f /Users/dhtp/Documents/CwlUtils/.build/debug.yaml
Was geht hier vor? Beide Versionen mutieren den internen Wert von counter
(der auf den Parameter mutate
übertragen wird) in genau der gleichen Weise. Warum ist das eine legal und das andere nicht?
Wie kann ich die Schließung erklären, so dass es kompiliert (und macht was ich will)?
Ich versuchte { (inout value) in ... }
, aber das gibt den gleichen Fehler.
Meine Vermutung ist, dass der Compiler es irgendwie als Änderung der Funktion sieht, die an 'muate' übergeben wird. Art von funky. – PeejWeej
[Fertig] (https://bugs.swift.org/browse/SR-3973), danke! – Raphael
@PEEJWEEJ Eine Nicht-Wurf-Funktion wird als Spezialisierung der Wurffunktion mit denselben Parametern betrachtet, d.h. '(inout Int) -> Leere 'ist ein Subtyp von' (inout Int) Würfe -> Leere '. Sie können also eine Nicht-Wurf-Funktion verwenden, bei der der Parameter als Werfen deklariert ist, aber Sie können keine Wurf-Funktion verwenden, bei der der Parameter nicht als Werfen deklariert ist. – JeremyP