Saya perhatikan ketika menulis assert
di Swift bahwa nilai pertama diketikkan sebagai
@autoclosure() -> Bool
dengan metode kelebihan beban untuk mengembalikan T
nilai generik , untuk menguji keberadaan melalui LogicValue
protocol
.
Namun berpegang erat pada pertanyaan yang ada. Tampaknya ingin @autoclosure
yang mengembalikan a Bool
.
Menulis penutupan yang sebenarnya tanpa parameter dan mengembalikan Bool tidak berfungsi, ia ingin saya memanggil penutupan untuk membuatnya dikompilasi, seperti:
assert({() -> Bool in return false}(), "No user has been set", file: __FILE__, line: __LINE__)
Namun demikian, hanya melewati karya Bool:
assert(false, "No user has been set", file: __FILE__, line: __LINE__)
Jadi apa yang terjadi? Apa @autoclosure
?
Sunting: @auto_closure
diubah namanya@autoclosure
f({2 >1}())
f(2 > 1)
berhasil. Panggilanf({2 > 1})
gagal denganerror: function produces expected type 'Bool'; did you mean to call it with '()'?
. Saya mengujinya di taman bermain dan dengan Swift REPL.func f(@autoclosure pred: () -> Bool)
Inilah contoh praktis -
print
penggantian saya (ini Swift 3):Ketika Anda mengatakan
print(myExpensiveFunction())
,print
override saya menaungi Swiftprint
dan dipanggil.myExpensiveFunction()
dengan demikian dibungkus dalam penutupan dan tidak dievaluasi . Jika kita dalam mode Release, itu tidak akan pernah dievaluasi, karenaitem()
tidak akan dipanggil. Jadi kami memiliki versiprint
yang tidak mengevaluasi argumennya dalam mode Rilis.sumber
myExpensiveFunction()
? Jika alih-alih menggunakan autoclosure, Anda melewatkan fungsi untuk mencetakprint(myExpensiveFunction)
, apa dampaknya? Terima kasih.Deskripsi auto_closure dari dokumen:
Dan inilah contoh yang digunakan apel bersama dengannya.
Pada dasarnya apa yang Anda maksudkan adalah Anda memberikan ekspresi boolean sebagai argumen pertama alih-alih penutupan dan secara otomatis membuat penutupan untuk Anda. Itu sebabnya Anda bisa memasukkan false ke dalam metode karena itu adalah ekspresi boolean, tetapi tidak dapat melewati penutupan.
sumber
@auto_closure
sini. Kode berfungsi dengan baik tanpa itu:func simpleAssert(condition: Bool, message: String) { if !condition { println(message) } }
. Gunakan@auto_closure
ketika Anda perlu mengevaluasi argumen berulang kali (misalnya, jika Anda menerapkanwhile
fungsi-like) atau Anda perlu menunda evaluasi argumen (misalnya, jika Anda menerapkan hubungan arus pendek&&
).autoclosure
denganwhile
fungsi seperti? Saya sepertinya tidak memahaminya. Terima kasih banyak sebelumnya.Ini menunjukkan kasus bermanfaat dari
@autoclosure
https://airspeedvelocity.net/2014/06/28/extending-the-swift-language-is-cool-but-be-careful/sumber
Ini hanya cara untuk menghilangkan kurung kurawal dalam panggilan penutupan, contoh sederhana:
sumber
@autoclosure
adalah parameter fungsi yang menerima fungsi yang dimasak (atau tipe yang dikembalikan) sementara seorang umumclosure
menerima fungsi mentahMari kita lihat contohnya
sumber