Tutorial penutupan Swift Terbaik Pada tahun 2024, Dalam tutorial ini Anda dapat mempelajari penutupan ekspresi,singkatan nama parameter,fungsi Operator,Trailing Penutupan,nilai ditangkap,Penutupan adalah jenis referensi,
Penutupan (penutupan) adalah sebuah blok mandiri fungsional kode, Anda dapat menggunakan atau digunakan sebagai nilai parameter dalam kode.
penutupan cepat dalam C dan blok kode Objective-C (blok) dan beberapa bahasa pemrograman lain fungsi anonim sangat mirip.
fungsi global dan fungsi bersarang sebenarnya penutupan khusus.
Penutupan bentuk:
Fungsi global | fungsi bersarang | penutupan ekspresi |
Aku punya nama tapi tidak dapat menangkap nilai apapun. | Ini memiliki nama, tetapi juga untuk menangkap nilai dalam fungsi ditutup. | penutupan Nameless, menggunakan sintaks ringan, Anda dapat menangkap nilai berdasarkan konteks. |
penutupan Swift memiliki banyak tempat optimasi:
Berikut ini mendefinisikan parameter penerima dan mengembalikan jenis tertentu dari sintaks penutupan:
{(parameters) -> return type in statements }
import Cocoa let studname = { print("Swift 闭包实例。") } studname()
Output di atas eksekusi program adalah:
Swift 闭包实例。
Bentuk penutupan berikut mengambil dua parameter dan mengembalikan nilai Boolean:
{(Int, Int) -> Bool in Statement1 Statement 2 --- Statement n }
import Cocoa let divide = {(val1: Int, val2: Int) -> Int in return val1 / val2 } let result = divide(200, 20) print (result)
Output di atas eksekusi program adalah:
10
ekspresi penutupan adalah cara untuk membangun penggunaan penutupan sintaks inline sederhana. sintaks ekspresi penutupan menyediakan beberapa optimasi sehingga membentuk penutupan menjadi sederhana dan jelas.
Swift standar perpustakaan menyediakan fungsi bernama semacam, itu akan diurutkan sesuai dengan fungsi penutupan yang Anda berikan akan digunakan untuk mengurutkan nilai jenis yang dikenal dalam array.
Setelah selesai semacam itu, semacam (_ :) metode mengembalikan sebuah array dengan ukuran yang sama seperti aslinya, array baru berisi jenis yang sama dari unsur dan elemen telah disortir dengan benar, array asli tidak diubah semacam (_ :) metode.
semacam (_ :) metode membutuhkan dua argumen:
true
, bertentangan dengan kembali false
. import Cocoa let names = ["AT", "AE", "D", "S", "BE"] // 使用普通函数(或内嵌函数)提供排序功能,闭包函数类型需为(String, String) -> Bool。 func backwards(s1: String, s2: String) -> Bool { return s1 > s2 } var reversed = names.sort(backwards) print(reversed)
Output di atas eksekusi program adalah:
["S", "D", "BE", "AT", "AE"]
Jika string karakter pertama (s1) lebih besar dari string kedua (s2), mundur mengembalikan fungsi benar, menunjukkan bahwa array baru harus muncul sebelum s1 s2. Untuk karakter dalam string, yang "lebih besar dari" berarti "kemudian muncul dalam urutan abjad." Ini berarti bahwa huruf "B" lebih besar dari huruf "A", string "S" lebih besar dari string "D". Ini akan membalikkan semacam abjad, "AT" akan diurutkan sebelum "AE".
Swift otomatis memberikan nama parameter singkatan fungsi inline, Anda dapat langsung melalui $ 0 penutupan parameter $ 1, $ 2 untuk menelepon pesanan.
import Cocoa let names = ["AT", "AE", "D", "S", "BE"] var reversed = names.sort( { $0 > $1 } ) print(reversed)
$ 0 dan $ 1 untuk penutupan pertama dan parameter kedua tipe String.
Output di atas eksekusi program adalah:
["S", "D", "BE", "AT", "AE"]
Jika Anda menggunakan singkatan nama parameter dalam ekspresi penutupan, Anda dapat penutupan daftar parameter definisi dihilangkan, dan nama parameter jenis Akronim sesuai akan disimpulkan oleh tipe fungsi. kata kunci juga dapat dihilangkan.
Bahkan ada cara yang lebih pendek untuk menulis di atas ekspresi contoh penutupan.
Swift String
Jenis mendefinisikan pada besar-dari tanda ( >
implementasi string), sebagai fungsi yang mengambil dua String
jenis parameter dan mengembalikan Bool
jenis nilai. Hal ini bertepatan dengan sort(_:)
fungsi jenis parameter kedua metode perlu menyesuaikan diri. Oleh karena itu, Anda hanya dapat lulus lebih besar daripada tanda, Swift otomatis dapat menyimpulkan bahwa Anda ingin menggunakan lebih besar dari jumlah fungsi string untuk mencapai:
import Cocoa let names = ["AT", "AE", "D", "S", "BE"] var reversed = names.sort(>) print(reversed)
Output di atas eksekusi program adalah:
["S", "D", "BE", "AT", "AE"]
Trailing penutupan adalah fungsi yang ditulis dalam tanda kurung setelah penutupan ekspresi, fungsi untuk mendukung panggilan sebagai parameter terakhir.
func someFunctionThatTakesAClosure(closure: () -> Void) { // 函数体部分 } // 以下是不使用尾随闭包进行函数调用 someFunctionThatTakesAClosure({ // 闭包主体部分 }) // 以下是使用尾随闭包进行函数调用 someFunctionThatTakesAClosure() { // 闭包主体部分 }
import Cocoa let names = ["AT", "AE", "D", "S", "BE"] //尾随闭包 var reversed = names.sort() { $0 > $1 } print(reversed)
sort () setelah {$ 0> $ 1} mengikuti penutupan.
Output di atas eksekusi program adalah:
["S", "D", "BE", "AT", "AE"]
Catatan: Jika fungsi hanya satu parameter ekspresi penutupan, ketika Anda menggunakan tertinggal penutupan, Anda bahkan dapat menempatkan
()
dihilangkan.reversed = names.sort { $0 > $1 }
Penutupan dapat konstan atau variabel capture dalam konteks definisi.
Bahkan definisi konstanta dan variabel dari domain asli tidak ada, penutupan masih dapat berfungsi in vivo penutupan referensi dan modifikasi nilai-nilai ini.
bentuk paling mudah Swift penutupan bersarang fungsi, fungsi didefinisikan dalam tubuh fungsi lain dari fungsi.
Fungsi bersarang dapat menangkap semua parameter eksternal fungsi dan konstanta didefinisikan dan variabel.
Lihatlah contoh ini:
func makeIncrementor(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementor() -> Int { runningTotal += amount return runningTotal } return incrementor }
Sebuah makeIncrementor fungsi, ia memiliki parameter tipe Int amout, dan memiliki nama parameter forIncremet eksternal, berarti bahwa ketika Anda menelepon, Anda harus menggunakan nama eksternal. Nilai kembali adalah ()-> Int
fungsi.
Dalam fungsi judul, mendeklarasikan variabel dan incrementor fungsi runningTotal.
Fungsi incrementor tidak mendapatkan argumen, tetapi dalam tubuh fungsi untuk mengakses runningTotal dan jumlah variabel. Hal ini karena mengandung tubuh fungsi dengan menangkap runningTotal yang ada dan jumlah variabel menyadari.
Karena tidak ada variabel jumlah modifikasi, incrementor sebenarnya menangkap dan menyimpan salinan dari variabel, yang disimpan bersama dengan salinan sebagai incrementor.
Jadi ketika kita memanggil fungsi ini akan menumpuk:
import Cocoa func makeIncrementor(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementor() -> Int { runningTotal += amount return runningTotal } return incrementor } let incrementByTen = makeIncrementor(forIncrement: 10) // 返回的值为10 print(incrementByTen()) // 返回的值为20 print(incrementByTen()) // 返回的值为30 print(incrementByTen())
Output di atas eksekusi program adalah:
10 20 30
Contoh di atas, incrementByTen konstan, tetapi titik penutupan konstanta ini masih dapat meningkatkan nilai capture variabelnya.
Hal ini karena fungsi dan penutupan yang jenis referensi.
Apakah Anda seorang fungsi / penutupan ditugaskan untuk konstan atau variabel, Anda benar-benar menetapkan nilai / variabel referensi fungsi / penutupan sesuai konstan. Contoh di atas, incrementByTen penutupan titik referensi adalah konstan, bukan isi dari penutupan itu sendiri.
Ini juga berarti bahwa jika Anda menetapkan penutupan dua yang berbeda konstanta / variabel, kedua nilai akan mengarah ke penutupan yang sama:
import Cocoa func makeIncrementor(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementor() -> Int { runningTotal += amount return runningTotal } return incrementor } let incrementByTen = makeIncrementor(forIncrement: 10) // 返回的值为10 incrementByTen() // 返回的值为20 incrementByTen() // 返回的值为30 incrementByTen() // 返回的值为40 incrementByTen() let alsoIncrementByTen = incrementByTen // 返回的值也为50 print(alsoIncrementByTen())
Output di atas eksekusi program adalah:
50