titel Wie macht man eine optionale Schließung in swift?




wordpress title startseite (4)

Ich versuche ein Argument in Swift zu deklarieren, das eine optionale Sperrung erfordert. Die Funktion, die ich deklariert habe, sieht so aus:

class Promise {

 func then(onFulfilled: ()->(), onReject: ()->()?){       
    if let callableRjector = onReject {
      // do stuff! 
    }
 }

}

Aber Swift beschwert sich darüber, dass "Gebundener Wert in einem Bedingungsfall ein optionaler Typ sein muss", wobei "wenn lassen" deklariert wird.


Da ich davon ausgehe, dass diese "optionale" Sperrung einfach nichts machen soll, könnten Sie einen Parameter mit einem leeren Closure als Standardwert verwenden:

func then(onFulfilled: ()->(), onReject: ()->() = {}){       
    // now you can call your closures
    onFulfilled()
    onReject()
}

Diese Funktion kann jetzt mit oder ohne den onReject Callback onReject

then({ ... })
then({ ... }, onReject: { ... })

Keine Notwendigkeit für Swifts großartige Optionals? Hier!


Sie sollten den optionalen Verschluss in Klammern einschließen. Dies wird den ? Operator.

func then(onFulfilled: ()->(), onReject: (()->())?){       
    if let callableRjector = onReject {
      // do stuff! 
    }
 }

Um den Code noch kürzer zu machen, können wir nil als Standardwert für onReject Parameter und optionale Verkettung ?() wenn wir ihn aufrufen:

func then(onFulfilled: ()->(), onReject: (()->())? = nil) {
  onReject?()
}

Auf diese Weise können wir onReject Parameter weglassen, wenn wir then Funktion aufrufen.

then({ /* on fulfilled */ })

Wir können auch die onReject Closure-Syntax verwenden, um onReject Parameter " onReject in die Funktion " then :

then({ /* on fulfilled */ }) {
  // ... on reject
}

Hier ist ein Blogpost darüber.


Vielleicht ist es ein sauberer Weg. Besonders wenn der Verschluss komplizierte Parameter hat.

typealias SimpleCallBack = () -> ()

class Promise {

func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){       
    if let callableRjector = onReject {
        // do stuff! 
    }
}

}




optional-parameters