Saya mencoba menyatakan argumen di Swift yang membutuhkan penutupan opsional. Fungsi yang telah saya nyatakan terlihat seperti ini:
class Promise {
func then(onFulfilled: ()->(), onReject: ()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
Namun Swift mengeluh bahwa "Nilai terikat dalam kondisional harus berupa tipe Opsional" di mana "jika biarkan" dideklarasikan.
swift
optional-parameters
Marcosc
sumber
sumber
Jawaban:
Anda harus memasukkan penutup opsional dalam tanda kurung. Ini akan mencakup
?
operator dengan benar.sumber
()->Int?
artinya.?
ini sebenarnya hanya gula untukOptional<T>
, jadi Anda juga bisa menulis `func then (onFulfilled: () -> (), onReject: Opsional <() -> ()>) {`maka Anda tidak akan membutuhkan ekstra()
, meskipun IMO()?
lebih cantik. Anda juga dapat membuatnya lebih cantik dengan typealias sepertitypealias RejectHandler = () -> ()
func then(onFulfilled: ()->(), onReject: RejectHandler?) {
Untuk membuat kode lebih pendek, kita dapat menggunakan
nil
nilai default untukonReject
parameter dan rangkaian opsional?()
saat memanggilnya:Dengan cara ini kita bisa menghilangkan
onReject
parameter saat kita memanggilthen
fungsi.Kita juga bisa menggunakan sintaks penutupan jejak untuk melewatkan
onReject
parameter ke dalamthen
fungsi:Berikut adalah posting blog tentang itu.
sumber
Karena saya berasumsi, bahwa penutupan "opsional" ini seharusnya tidak melakukan apa-apa, Anda dapat menggunakan parameter dengan penutupan kosong sebagai nilai default:
fungsi ini sekarang dapat dipanggil dengan atau tanpa
onReject
callbackTidak perlu Swift keren di
Optionals?
sini!sumber
Mungkin ini cara yang lebih bersih. Khususnya jika closure memiliki parameter yang rumit.
sumber