Ich versuche, in Swift ein Argument zu deklarieren, das optional geschlossen werden kann. Die von mir deklarierte Funktion sieht folgendermaßen aus:
class Promise {
func then(onFulfilled: ()->(), onReject: ()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
Swift beschwert sich jedoch darüber, dass "Gebundener Wert in einer Bedingung ein optionaler Typ sein muss", in dem "if let" deklariert ist.
swift
optional-parameters
Marcosc
quelle
quelle
Antworten:
Sie sollten den optionalen Verschluss in Klammern setzen. Dadurch wird der
?
Bediener ordnungsgemäß erfasst .quelle
()->Int?
bedeutet.?
wirklich nur ZuckerOptional<T>
ist. Sie können also auch `func then (onFulfilled: () -> (), onReject: Optional <() schreiben. -> ()>) {`dann würden Sie das Extra nicht brauchen()
, obwohl IMO das()?
schöner ist. Sie können es auch mit einem Typealias wietypealias RejectHandler = () -> ()
func then(onFulfilled: ()->(), onReject: RejectHandler?) {
Um den Code noch kürzer zu machen, können wir ihn beim Aufrufen
nil
als Standardwert füronReject
Parameter und optionale Verkettung verwenden?()
:Auf diese Weise können wir
onReject
Parameter weglassen , wenn wirthen
function aufrufen .Wir können auch die Trailing-Closure-Syntax verwenden, um
onReject
Parameter an diethen
Funktion zu übergeben:Hier ist ein Blog-Beitrag darüber.
quelle
Da ich davon ausgehe, dass dieser "optionale" Abschluss einfach nichts bewirken sollte, können Sie einen Parameter mit einem leeren Abschluss als Standardwert verwenden:
Diese Funktion kann jetzt mit oder ohne
onReject
Rückruf aufgerufen werdenSwift ist
Optionals?
hier nicht nötig !quelle
Vielleicht ist es ein sauberer Weg. Besonders wenn der Verschluss komplizierte Parameter hat.
quelle