Latest web development tutorials

ปิดสวิฟท์

ปิด (ปิด) เป็นบล็อกที่ตนเองมีการทำงานของรหัสที่คุณสามารถใช้หรือนำมาใช้เป็นค่าพารามิเตอร์ในรหัส

ปิดสวิฟท์ใน C และบล็อกรหัส Objective-C (บล็อก) และบางภาษาโปรแกรมอื่น ๆ ฟังก์ชั่นที่ไม่ระบุชื่อค่อนข้างคล้าย

ฟังก์ชั่นทั่วโลกและฟังก์ชั่นที่ซ้อนกันเป็นจริงปิดพิเศษ

ปิดของรูปแบบ:

ฟังก์ชั่นทั่วโลก ฟังก์ชั่นที่ซ้อนกัน ปิดการแสดงออก
ฉันมีชื่อ แต่ไม่สามารถจับค่าใด ๆ มันมีชื่อ แต่ยังจับค่าภายในฟังก์ชั่นปิด ปิดนิรนามใช้ไวยากรณ์ที่มีน้ำหนักเบา, คุณสามารถจับภาพค่าตามบริบท

ปิดสวิฟท์มีจำนวนมากในสถานที่การเพิ่มประสิทธิภาพ:

  1. ทั้งนี้ขึ้นอยู่กับพารามิเตอร์บริบทสรุปและค่าตอบแทนประเภท
  2. จากบรรทัดเดียวปิดแสดงออกผลตอบแทนโดยนัย (นั่นคือร่างกายปิดเป็นเพียงหนึ่งบรรทัดของรหัสที่คุณสามารถละเว้นกลับ)
  3. มันสามารถนำมาใช้เพื่อลดความซับซ้อนของชื่อพารามิเตอร์เช่น $ 0, $ 1 (จาก 0 แสดงให้เห็นว่าข้อโต้แย้ง I-TH ... )
  4. ให้ไวยากรณ์ปิดท้าย (Trailing ไวยากรณ์ปิด)
  5. ไวยากรณ์

    ต่อไปนี้จะกำหนดพารามิเตอร์ที่ได้รับและส่งกลับชนิดที่ระบุไวยากรณ์ปิด:

    {(parameters) -> return type in
       statements
    }
    

    ตัวอย่าง

    import Cocoa
    
    let studname = { print("Swift 闭包实例。") }
    studname()
    

    เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

    Swift 闭包实例。
    

    รูปแบบการปิดต่อไปนี้จะใช้เวลาสองพารามิเตอร์และส่งกลับค่าบูลีน:

    {(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)
    

    เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

    10
    

    ปิดการแสดงออก

    การแสดงออกของการปิดเป็นวิธีที่จะสร้างการใช้งานของการปิดอินไลน์ไวยากรณ์ง่ายๆที่ ไวยากรณ์นิพจน์การปิดให้เพิ่มประสิทธิภาพการบางอย่างเพื่อให้ประกอบการปิดจะกลายเป็นง่ายและชัดเจน


    ฟังก์ชั่นการจัดเรียง

    ห้องสมุดมาตรฐานสวิฟท์ยังมีฟังก์ชั่นการจัดเรียงชื่อก็จะถูกจัดเรียงตามฟังก์ชั่นปิดคุณให้จะถูกนำมาใช้ในการจัดเรียงที่เรียกพิมพ์ค่าในอาร์เรย์

    หลังจากเสร็จสิ้นการจัดเรียงเรียงลำดับ (_ :) วิธีการส่งกลับอาร์เรย์ของขนาดเดียวกับต้นฉบับอาร์เรย์ใหม่ประกอบด้วยชนิดเดียวกันขององค์ประกอบและองค์ประกอบที่ได้รับการจัดเรียงอย่างถูกต้องอาร์เรย์ต้นฉบับไม่ได้มีการปรับเปลี่ยนการจัดเรียง (_ :) วิธีการ

    การจัดเรียง (_ :) วิธีการใช้เวลาสองอาร์กิวเมนต์:

    • อาร์เรย์ของชนิดที่รู้จักกัน
    • ฟังก์ชั่นปิดที่ปิดฟังก์ชั่นต้องผ่านอาร์เรย์ขององค์ประกอบที่มีชนิดเดียวกันของสองค่าและส่งกลับค่าบูลีนเพื่อบ่งชี้ว่าพารามิเตอร์แรกหลังจากการสิ้นสุดของแถวที่เข้ามาคัดแยกในด้านหน้าของหรือด้านหลังพารามิเตอร์ที่สอง หากค่าพารามิเตอร์แรกปรากฏในหน้าของค่าพารามิเตอร์ที่สองจัดเรียงฟังก์ชั่นการปิดความต้องการที่จะกลับมา true ตรงกันข้ามจะกลับมา 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)
    

    เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

    ["S", "D", "BE", "AT", "AE"]
    

    ถ้าสตริงตัวอักษรตัวแรก (S1) มากกว่าสายที่สอง (S2) ฟังก์ชั่นย้อนหลังผลตอบแทนจริงแสดงให้เห็นว่าแถวใหม่ควรจะปรากฏขึ้นก่อนที่จะ S1 S2 สำหรับตัวอักษรในสตริงที่ "มากกว่า" หมายถึง "ต่อมาปรากฏในลำดับตัวอักษร." ซึ่งหมายความว่าตัวอักษร "B" เป็นมากกว่าตัวอักษร "A" สตริง "S" มากกว่าสตริง "D" มันจะย้อนกลับการจัดเรียงตัวอักษร "ที่" จะถูกจัดเรียงก่อน "AE"


    ชื่อพารามิเตอร์ย่อ

    สวิฟท์โดยอัตโนมัติให้ฟังก์ชั่นแบบอินไลน์ย่อชื่อพารามิเตอร์คุณสามารถโดยตรงผ่าน $ 0 ปิดพารามิเตอร์ของ $ 1, $ 2 โทรสั่งซื้อ

    ตัวอย่าง

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    var reversed = names.sort( { $0 > $1 } )
    print(reversed)
    

    0 $ และ $ 1 สำหรับการปิดครั้งแรกและครั้งที่สองของพารามิเตอร์ชนิดสตริง

    เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

    ["S", "D", "BE", "AT", "AE"]
    

    ถ้าคุณใช้ตัวย่อชื่อพารามิเตอร์ในการแสดงออกของการปิดคุณสามารถปิดรายการพารามิเตอร์หมายของมันถูกละไว้และสอดคล้องกับชื่อพารามิเตอร์ประเภทย่อจะสรุปตามประเภทของฟังก์ชั่น ในคำหลักก็ยังสามารถถูกมองข้าม


    ฟังก์ชั่นผู้ประกอบการ

    ในความเป็นจริงมีวิธีที่สั้นกว่าจะเขียนข้างต้นตัวอย่างเช่นการปิดการแสดงออก

    สวิฟท์ String ประเภทกำหนดในเครื่องหมายมากกว่า ( > สตริง) การดำเนินการในขณะที่ฟังก์ชั่นที่ใช้เวลาสอง String พารามิเตอร์ชนิดและผลตอบแทน Bool ประเภทค่า นี้ใกล้เคียงกับ sort(_:) ฟังก์ชั่นประเภทของพารามิเตอร์ที่สองของวิธีการเพื่อให้สอดคล้องกับความต้องการ ดังนั้นคุณก็สามารถผ่านเข้าสู่ระบบมากขึ้นกว่าสวิฟท์จะสามารถอนุมานได้ว่าคุณต้องการใช้มากกว่าจำนวนของฟังก์ชั่นสตริงเพื่อให้บรรลุ:

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    var reversed = names.sort(>)
    print(reversed)
    

    เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

    ["S", "D", "BE", "AT", "AE"]
    

    ปิดท้าย

    ต่อท้ายปิดฟังก์ชั่นที่เขียนในวงเล็บหลังจากปิดการแสดงออก, ฟังก์ชั่นเพื่อสนับสนุนการเรียกเป็นพารามิเตอร์ที่ผ่านมา

    func someFunctionThatTakesAClosure(closure: () -> Void) {
        // 函数体部分
    }
    
    // 以下是不使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure({
        // 闭包主体部分
    })
    
    // 以下是使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure() {
      // 闭包主体部分
    }
    

    ตัวอย่าง

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    //尾随闭包
    var reversed = names.sort() { $0 > $1 }
    print(reversed)
    

    การจัดเรียง () หลังจาก {0 $> $ 1} ท้ายปิด

    เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

    ["S", "D", "BE", "AT", "AE"]
    

    หมายเหตุ: หากฟังก์ชั่นเพียงการปิดการแสดงออกพารามิเตอร์หนึ่งเมื่อคุณใช้การปิดท้ายคุณสามารถใส่แม้กระทั่ง () ละเว้น

    reversed = names.sort { $0 > $1 }
    

    ค่าจับ

    การปิดสามารถจับภาพคงที่หรือตัวแปรในบริบทของความหมายของมัน

    แม้ความหมายของค่าคงที่เหล่านี้และตัวแปรของโดเมนเดิมไม่ได้อยู่ที่การปิดยังคงสามารถทำงานในการอ้างอิงปิดร่างกายและการปรับเปลี่ยนค่าเหล่านี้

    รูปแบบที่ง่ายที่สุดของการปิดสวิฟท์เป็นฟังก์ชันที่ซ้อนกันฟังก์ชั่นที่มีการกำหนดไว้ในร่างของฟังก์ชั่นอื่น ๆ ของฟังก์ชั่น

    ฟังก์ชั่นที่ซ้อนกันสามารถจับภาพทั้งหมดของพารามิเตอร์ฟังก์ชันภายนอกและคงที่และตัวแปรที่กำหนดไว้

    ดูตัวอย่างนี้

    func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    

    makeIncrementor ฟังก์ชั่นก็มีพารามิเตอร์ชนิด int amout และมันมี forIncremet ชื่อพารามิเตอร์ภายนอกหมายความว่าเมื่อคุณโทรหาคุณต้องใช้ชื่อภายนอก ค่าตอบแทนเป็น ()-> Int ฟังก์ชั่น

    ในฟังก์ชั่นชื่อประกาศตัวแปรและฟังก์ชั่น RunningTotal incrementor

    ฟังก์ชั่น incrementor ไม่ได้รับข้อโต้แย้งใด ๆ แต่ในร่างกายของฟังก์ชันในการเข้าถึง RunningTotal และตัวแปรจำนวน นี้เป็นเพราะมันมีร่างกายของฟังก์ชันโดยจับ RunningTotal เดิมและปริมาณตระหนัก

    เนื่องจากไม่มีตัวแปรจำนวนเงินที่ปรับเปลี่ยน incrementor จริงรวบรวมและจัดเก็บสำเนาของตัวแปรที่ถูกเก็บไว้พร้อมสำเนาเป็น incrementor ที่

    ดังนั้นเมื่อเราเรียกใช้ฟังก์ชันนี้จะสะสม:

    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())
    

    เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

    10
    20
    30
    

    การปิดประเภทอ้างอิง

    ตัวอย่างข้างต้น incrementByTen เป็นค่าคงที่ แต่จุดปิดคงที่เหล่านี้ยังสามารถเพิ่มมูลค่าของการจับภาพของตัวแปร

    เพราะนี่คือการทำงานและการปิดประเภทอ้างอิง

    ไม่ว่าคุณจะเป็นฟังก์ชั่น / ปิดได้รับมอบหมายให้เป็นค่าคงที่หรือตัวแปรคุณเป็นจริงการตั้งค่าของคงที่ / ตัวแปรที่สอดคล้องกันฟังก์ชั่น / อ้างอิงปิด ตัวอย่างข้างต้น incrementByTen ฝาปิดจุดอ้างอิงเป็นค่าคงที่มากกว่าเนื้อหาของการปิดตัวเอง

    นี่ก็หมายความว่าถ้าคุณกำหนดปิดของทั้งสองแตกต่างกันคงที่ / ตัวแปรทั้งสองค่าจะชี้ไปที่ปิดเหมือนเดิม:

    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())
    

    เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

    50