ฟังก์ชั่นรับอินพุต ทำบางสิ่งกับมัน และสร้างเอาต์พุต ฟังก์ชันมีลายเซ็นและเนื้อหา หากคุณป้อนฟังก์ชันเดียวกัน คุณจะได้รับเอาต์พุตเดียวกันเสมอ นั่นคือคำจำกัดความสั้น ๆ สำหรับ ฟังก์ชัน .
ตอนนี้เราจะพูดถึงฟังก์ชันเพิ่มเติมโดยพิจารณาให้ละเอียดยิ่งขึ้น เราจะสำรวจฟังก์ชั่นการสั่งซื้อที่สูงขึ้นใน Swift ฟังก์ชันที่ใช้ฟังก์ชันอื่นเป็นอินพุตหรือส่งคืนฟังก์ชันเรียกว่า ฟังก์ชั่นการสั่งซื้อที่สูงขึ้น .
ใน Swift เราเล่นกับ แผนที่ กรอง ลด ทุกวัน. เมื่อเราใช้ฟังก์ชันเหล่านี้ ดูเหมือนว่ามีเวทย์มนตร์ ณ จุดนี้ คุณอาจไม่รู้ว่าเกิดอะไรขึ้นเบื้องหลัง แมป กรอง และลดการทำงานผ่านแนวคิดและแนวทางของการเขียนโปรแกรมเชิงฟังก์ชัน แม้ว่า Swift จะไม่ใช่ภาษาที่ใช้งานได้จริง แต่ก็ช่วยให้คุณทำสิ่งที่มีประโยชน์ได้
ตอนนี้เรามาดูกันทีละว่าเกิดอะไรขึ้นในเบื้องหลังสำหรับพวกเขา ขั้นแรก เราจะใช้เวอร์ชันพื้นฐานของฟังก์ชันเหล่านี้สำหรับข้อมูลบางประเภท จากนั้นเราจะพยายามใช้เวอร์ชันทั่วไป
ฟังก์ชันแผนที่
สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มและเราจำเป็นต้องเขียนฟังก์ชันที่ส่งกลับอาร์เรย์ใหม่หลังจากเพิ่มค่าเดลต้าให้กับแต่ละองค์ประกอบของอาร์เรย์ดั้งเดิม เราสามารถเขียนฟังก์ชันสำหรับสิ่งนี้ได้ง่ายๆ โดยใช้ for loop แบบง่ายดังนี้:
ตอนนี้เราต้องการฟังก์ชันอื่นที่คืนค่าอาร์เรย์ใหม่โดยเพิ่มแต่ละองค์ประกอบของอาร์เรย์ดั้งเดิมเป็นสองเท่า สำหรับสิ่งนี้ เราสามารถนำไปใช้ได้ดังนี้:
หากเราดูฟังก์ชันทั้งสองข้างต้น เราจะพบว่าโดยพื้นฐานแล้วฟังก์ชันเหล่านี้ทำสิ่งเดียวกัน เฉพาะฟังก์ชันภายใน for loop เท่านั้นที่ต่างกัน ทั้งคู่ใช้ จำนวนเต็ม array เป็นอินพุต แปลงแต่ละองค์ประกอบโดยใช้ for loop และส่งคืนอาร์เรย์ใหม่ โดยพื้นฐานแล้วสิ่งสำคัญคือการเปลี่ยนแต่ละองค์ประกอบให้เป็นสิ่งใหม่
เนื่องจาก Swift รองรับฟังก์ชันที่มีลำดับสูงกว่า เราจึงสามารถเขียนฟังก์ชันที่จะรับอาร์เรย์ของจำนวนเต็ม แปลงฟังก์ชันเป็นอินพุต และคืนค่าอาร์เรย์ใหม่โดยใช้ฟังก์ชัน transform กับแต่ละองค์ประกอบของอาร์เรย์ดั้งเดิม
แต่ยังคงมีปัญหากับสิ่งที่กล่าวข้างต้น:มันส่งกลับเฉพาะอาร์เรย์จำนวนเต็มเท่านั้น ถ้าเรามีข้อกำหนดในการแปลงอาร์เรย์จำนวนเต็มอินพุตเป็นอาร์เรย์สตริง เราก็ไม่สามารถทำได้ด้วยฟังก์ชันนี้ ในการทำเช่นนั้น เราต้องเขียนฟังก์ชันทั่วไปที่ใช้ได้กับทุกประเภท
เราสามารถใช้ฟังก์ชันทั่วไปในส่วนขยาย Array ได้ดังนี้:
- ประกาศฟังก์ชันแผนที่ใน Array Extension ซึ่งใช้งานได้กับประเภททั่วไป T .
- ฟังก์ชันใช้ฟังก์ชันประเภท (Element) ->; T เป็นอินพุต
- ประกาศอาร์เรย์ผลลัพธ์ว่างซึ่งมี T พิมพ์ข้อมูลภายในฟังก์ชัน
- ใช้ a for loop iterating ตัวเองและเรียกใช้ฟังก์ชัน transform เพื่อแปลงองค์ประกอบเป็นประเภท T
- ต่อท้ายค่าที่แปลงแล้วในอาร์เรย์ผลลัพธ์
นี่คือลักษณะของ แผนที่ ฟังก์ชั่นทำงานใน Swift หากเราจำเป็นต้องติดตั้ง แผนที่ ฟังก์ชั่น, แล้วเราจะนำไปปฏิบัติเหมือนข้างต้น โดยพื้นฐานแล้ว มันไม่ได้ทำให้เวทย์มนตร์เกิดขึ้นในอาร์เรย์ — เราสามารถกำหนดฟังก์ชันได้อย่างง่ายดายด้วยตัวเอง
ฟังก์ชันตัวกรอง
สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มและเราต้องการเก็บเฉพาะตัวเลขคู่ในอาร์เรย์ เราสามารถทำได้โดยใช้ for loop แบบง่าย:
อีกครั้ง สมมติว่าเรามีอาร์เรย์ของสตริงที่แสดงชื่อไฟล์คลาสของโปรเจ็กต์ และเราต้องการเก็บเฉพาะ . รวดเร็ว ไฟล์. สามารถทำได้ด้วยการวนซ้ำดังนี้:
หากเราพิจารณาการใช้งานสองฟังก์ชันข้างต้นอย่างใกล้ชิด เราจะเข้าใจได้ว่าโดยพื้นฐานแล้วฟังก์ชันเหล่านี้ทำสิ่งเดียวกัน — เฉพาะชนิดข้อมูลเท่านั้นที่แตกต่างกันสำหรับอาร์เรย์ทั้งสอง เราสามารถสรุปสิ่งนี้ได้โดยใช้ฟังก์ชันตัวกรองทั่วไป ซึ่งรับอาร์เรย์และฟังก์ชันเป็นอินพุต และขึ้นอยู่กับเอาต์พุตของ includeElement ฟังก์ชันจะตัดสินใจว่าจะเพิ่มองค์ประกอบในอาร์เรย์ผลลัพธ์หรือไม่
ลดฟังก์ชัน
สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มและเราต้องการใช้ฟังก์ชันสองฟังก์ชันที่คืนค่าผลรวมและผลคูณขององค์ประกอบ เราสามารถทำได้โดยใช้ for loop แบบง่าย:
ตอนนี้แทนที่จะมีอาร์เรย์ของจำนวนเต็ม สมมติว่าเรามีอาร์เรย์ของสตริง และเราต้องการเชื่อมองค์ประกอบทั้งหมดในอาร์เรย์:
ฟังก์ชันทั้งสามโดยทั่วไปทำสิ่งเดียวกัน พวกเขารับอาร์เรย์เป็นอินพุต เริ่มต้นตัวแปรผลลัพธ์ วนซ้ำในอาร์เรย์ และอัปเดตตัวแปรผลลัพธ์
จากที่นี่ เราสามารถใช้ฟังก์ชันทั่วไปที่น่าจะใช้ได้กับทุกคน ในการทำเช่นนี้ เราจำเป็นต้องมีค่าเริ่มต้นของตัวแปรผลลัพธ์และฟังก์ชันเพื่ออัปเดตตัวแปรนั้นในทุกๆ การวนซ้ำ
ดังนั้นเราจึงสามารถใช้ฟังก์ชันทั่วไปโดยมีคำจำกัดความดังต่อไปนี้:
การใช้งานข้างต้นเป็นแบบทั่วไปสำหรับอาร์เรย์อินพุตประเภท [องค์ประกอบ] มันจะคำนวณผลลัพธ์ของประเภท T . ในการทำงาน ต้องมีค่าเริ่มต้นเป็นประเภท T เพื่อกำหนดให้กับตัวแปรผลลัพธ์ จากนั้นจึงต้องการฟังก์ชันประเภท (T, Element) -> T ซึ่งจะใช้ภายใน for loop ในการวนซ้ำแต่ละครั้งเพื่ออัปเดตตัวแปรผลลัพธ์