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

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

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

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

ฟังก์ชั่นแผนที่

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

ตอนนี้เราต้องการฟังก์ชันอื่นที่ส่งคืนอาร์เรย์ใหม่โดยเพิ่มแต่ละองค์ประกอบของอาร์เรย์ดั้งเดิมเป็นสองเท่า สำหรับสิ่งนี้ เราสามารถนำมาใช้ได้ดังนี้:

ถ้าเราดูทั้งสองฟังก์ชันข้างต้น เราจะพบว่าโดยพื้นฐานแล้วพวกมันทำสิ่งเดียวกัน เฉพาะฟังก์ชันการทำงานภายใน for loop เท่านั้นที่แตกต่างกัน ทั้งสองใช้อาร์เรย์ Integer เป็นอินพุต จากนั้นแปลงแต่ละองค์ประกอบโดยใช้ for loop และส่งคืนอาร์เรย์ใหม่ โดยพื้นฐานแล้วสิ่งสำคัญคือการเปลี่ยนแต่ละองค์ประกอบให้เป็นสิ่งใหม่

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

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

เราสามารถใช้ฟังก์ชันทั่วไปในส่วนขยาย Array ได้ดังนี้:

  1. ประกาศฟังก์ชันแผนที่ใน Array Extension ซึ่งทำงานกับประเภททั่วไป T
  2. ฟังก์ชันรับฟังก์ชันประเภท (Element) -› Tเป็นอินพุต
  3. ประกาศอาร์เรย์ผลลัพธ์ว่างซึ่งเก็บข้อมูลประเภท T ไว้ภายในฟังก์ชัน
  4. ใช้ for loop วนซ้ำตัวเองและเรียกใช้ฟังก์ชันการแปลงเพื่อแปลงองค์ประกอบให้เป็นประเภท T
  5. ผนวกค่าที่แปลงแล้วในอาร์เรย์ผลลัพธ์

นี่คือวิธีการทำงานของฟังก์ชัน แผนที่ ใน Swift หากเราจำเป็นต้องใช้งาน mapฟังก์ชั่น เราก็จะต้องใช้งานมันเหมือนข้างบน โดยพื้นฐานแล้ว มันไม่ได้ทำให้เกิดเวทย์มนตร์ใดๆ เกิดขึ้นในอาร์เรย์ — เราสามารถกำหนดฟังก์ชันได้อย่างง่ายดายด้วยตัวเอง

ฟังก์ชั่นตัวกรอง

สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มและเราต้องการที่จะเก็บเฉพาะเลขคู่ในอาร์เรย์ เราสามารถนำสิ่งนี้ไปใช้โดยใช้ for loop แบบง่าย:

อีกครั้ง สมมติว่าเรามีอาร์เรย์ของสตริงที่แสดงชื่อไฟล์คลาสของโปรเจ็กต์ และเราต้องการเก็บเฉพาะไฟล์ swift เท่านั้น ซึ่งสามารถทำได้ด้วยการวนซ้ำเดียวดังนี้:

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

ลดฟังก์ชัน

สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มและเราต้องการใช้ฟังก์ชันสองฟังก์ชันซึ่งจะคืนค่าผลรวมและผลคูณขององค์ประกอบ เราสามารถนำสิ่งนี้ไปใช้โดยใช้ for loop แบบง่าย:

ตอนนี้แทนที่จะมีอาร์เรย์ของจำนวนเต็ม สมมติว่าเรามีอาร์เรย์ของสตริงและเราต้องการที่จะเชื่อมองค์ประกอบทั้งหมดในอาร์เรย์:

โดยพื้นฐานแล้วทั้งสามฟังก์ชั่นก็ทำสิ่งเดียวกัน โดยรับอาร์เรย์เป็นอินพุต เริ่มต้นตัวแปรผลลัพธ์ วนซ้ำอาร์เรย์ และอัปเดตตัวแปรผลลัพธ์

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

ดังนั้นเราจึงสามารถใช้ฟังก์ชันทั่วไปตามคำจำกัดความต่อไปนี้:

การใช้งานข้างต้นเป็นแบบทั่วไปสำหรับอาร์เรย์อินพุตประเภท [Element] มันจะคำนวณผลลัพธ์ประเภท T ในการทำงาน ต้องมีค่าเริ่มต้นประเภท T เพื่อกำหนดให้กับตัวแปรผลลัพธ์ จากนั้น จำเป็นต้องมีฟังก์ชันประเภท (T, Element) -› Tซึ่งจะถูกใช้ภายใน for loop ในการวนซ้ำแต่ละครั้งเพื่ออัปเดตตัวแปรผลลัพธ์

ขอบคุณสำหรับการอ่าน!