Latest web development tutorials

penutupan Swift

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:

  1. Tergantung pada parameter konteks mengambil kesimpulan dan nilai kembali jenis
  2. Dari single-line ekspresi penutupan pulang implisit (yaitu, tubuh penutupan hanya satu baris kode, Anda dapat menghilangkan pulang)
  3. Hal ini dapat digunakan untuk menyederhanakan nama parameter, seperti $ 0, $ 1 (dari 0, menunjukkan bahwa argumen-i ...)
  4. Menyediakan sintaks membuntuti penutupan (sintaks penutupan Trailing)
  5. tatabahasa

    Berikut ini mendefinisikan parameter penerima dan mengembalikan jenis tertentu dari sintaks penutupan:

    {(parameters) -> return type in
       statements
    }
    

    contoh

    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
    }
    

    contoh

    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
    

    penutupan ekspresi

    ekspresi penutupan adalah cara untuk membangun penggunaan penutupan sintaks inline sederhana. sintaks ekspresi penutupan menyediakan beberapa optimasi sehingga membentuk penutupan menjadi sederhana dan jelas.


    fungsi semacam

    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:

    • Array tipe diketahui
    • fungsi penutupan, yang penutupan fungsi harus lulus array elemen dengan jenis yang sama dari dua nilai dan mengembalikan nilai Boolean untuk menunjukkan bahwa parameter pertama setelah akhir baris masuk pemilahan di depan atau di belakang parameter kedua. Jika nilai-nilai parameter pertama muncul di depan nilai-nilai parameter kedua, memilah fungsi penutupan perlu kembali true , bertentangan dengan kembali false .

    contoh

    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".


    singkatan nama parameter

    Swift otomatis memberikan nama parameter singkatan fungsi inline, Anda dapat langsung melalui $ 0 penutupan parameter $ 1, $ 2 untuk menelepon pesanan.

    contoh

    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.


    fungsi Operator

    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

    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() {
      // 闭包主体部分
    }
    

    contoh

    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 }
    

    nilai ditangkap

    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
    

    Penutupan adalah jenis referensi

    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