ปิดสวิฟท์
ปิด (ปิด) เป็นบล็อกที่ตนเองมีการทำงานของรหัสที่คุณสามารถใช้หรือนำมาใช้เป็นค่าพารามิเตอร์ในรหัส
ปิดสวิฟท์ใน C และบล็อกรหัส Objective-C (บล็อก) และบางภาษาโปรแกรมอื่น ๆ ฟังก์ชั่นที่ไม่ระบุชื่อค่อนข้างคล้าย
ฟังก์ชั่นทั่วโลกและฟังก์ชั่นที่ซ้อนกันเป็นจริงปิดพิเศษ
ปิดของรูปแบบ:
ฟังก์ชั่นทั่วโลก | ฟังก์ชั่นที่ซ้อนกัน | ปิดการแสดงออก |
ฉันมีชื่อ แต่ไม่สามารถจับค่าใด ๆ | มันมีชื่อ แต่ยังจับค่าภายในฟังก์ชั่นปิด | ปิดนิรนามใช้ไวยากรณ์ที่มีน้ำหนักเบา, คุณสามารถจับภาพค่าตามบริบท |
ปิดสวิฟท์มีจำนวนมากในสถานที่การเพิ่มประสิทธิภาพ:
- ทั้งนี้ขึ้นอยู่กับพารามิเตอร์บริบทสรุปและค่าตอบแทนประเภท
- จากบรรทัดเดียวปิดแสดงออกผลตอบแทนโดยนัย (นั่นคือร่างกายปิดเป็นเพียงหนึ่งบรรทัดของรหัสที่คุณสามารถละเว้นกลับ)
- มันสามารถนำมาใช้เพื่อลดความซับซ้อนของชื่อพารามิเตอร์เช่น $ 0, $ 1 (จาก 0 แสดงให้เห็นว่าข้อโต้แย้ง I-TH ... )
- ให้ไวยากรณ์ปิดท้าย (Trailing ไวยากรณ์ปิด)
- อาร์เรย์ของชนิดที่รู้จักกัน
- ฟังก์ชั่นปิดที่ปิดฟังก์ชั่นต้องผ่านอาร์เรย์ขององค์ประกอบที่มีชนิดเดียวกันของสองค่าและส่งกลับค่าบูลีนเพื่อบ่งชี้ว่าพารามิเตอร์แรกหลังจากการสิ้นสุดของแถวที่เข้ามาคัดแยกในด้านหน้าของหรือด้านหลังพารามิเตอร์ที่สอง หากค่าพารามิเตอร์แรกปรากฏในหน้าของค่าพารามิเตอร์ที่สองจัดเรียงฟังก์ชั่นการปิดความต้องการที่จะกลับมา
true
ตรงกันข้ามจะกลับมาfalse
ไวยากรณ์
ต่อไปนี้จะกำหนดพารามิเตอร์ที่ได้รับและส่งกลับชนิดที่ระบุไวยากรณ์ปิด:
{(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
ปิดการแสดงออก
การแสดงออกของการปิดเป็นวิธีที่จะสร้างการใช้งานของการปิดอินไลน์ไวยากรณ์ง่ายๆที่ ไวยากรณ์นิพจน์การปิดให้เพิ่มประสิทธิภาพการบางอย่างเพื่อให้ประกอบการปิดจะกลายเป็นง่ายและชัดเจน
ฟังก์ชั่นการจัดเรียง
ห้องสมุดมาตรฐานสวิฟท์ยังมีฟังก์ชั่นการจัดเรียงชื่อก็จะถูกจัดเรียงตามฟังก์ชั่นปิดคุณให้จะถูกนำมาใช้ในการจัดเรียงที่เรียกพิมพ์ค่าในอาร์เรย์
หลังจากเสร็จสิ้นการจัดเรียงเรียงลำดับ (_ :) วิธีการส่งกลับอาร์เรย์ของขนาดเดียวกับต้นฉบับอาร์เรย์ใหม่ประกอบด้วยชนิดเดียวกันขององค์ประกอบและองค์ประกอบที่ได้รับการจัดเรียงอย่างถูกต้องอาร์เรย์ต้นฉบับไม่ได้มีการปรับเปลี่ยนการจัดเรียง (_ :) วิธีการ
การจัดเรียง (_ :) วิธีการใช้เวลาสองอาร์กิวเมนต์:
ตัวอย่าง
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