ว่าด้วย function ในภาษา Swift
function (ฟังก์ชัน)
ในภาษา Swift สามารถเขียนได้โดย ขึ้นต้นด้วยคำว่า func
แล้วเว้นวรรคตามด้วยชื่อฟังก์ชัน ตัวฟังก์ชันสามารถรับ arguments (อาร์กิวเมนต์) ได้ใน parentheses (วงเล็บ) หลังจากชื่อฟังก์ชัน และหากมี return value
ให้ใช้ ->
ซึ่งต้องเว้นวรรค
หลังจากวงเว็บเล็บและเว้นวรรค แล้วตามด้วย return type
อ่านแล้วงงมั้ยครับ 555 ไปดูตัวอย่างเลยดีกว่า
โดย default (โดยปริยาย) การเรียกใช้ฟังก์ชันจะต้องระบุ argument label (ชื่ออาร์กิวเมนต์) ด้วยดังในรูปที่ 1 หากในการเรียกใช้ต้องการเรียกใช้สามารถใช้ _
ข้างหน้าชื่ออาร์กิวเมนต์เพื่อเพิกเฉย หรือสามารถปรับชื่ออาร์กิวเมนต์ (custom argument label) โดยการใส่ชื่อไว้ข้างหน้าแทน
หมายเหตุ: พอดีไม่สามารถหานิยามภาษาไทยของ argument label ได้ครับ 555 จะแปล label ว่าป้ายก็เกรงใจ
Nested Function
ในภาษา Swift เองสามารถประกาศฟังก์ชันไว้ภายในฟังก์ชัน และสามารถเรียกใช้ได้ตามตัวอย่างในรูปที่ 3 ซึ่งจะเรียกแบบนี้ว่า nested function
โดย nested function
สามารถเข้าถึงตัวแปรที่อยู่ในฟังก์ชันด้านนอกได้ ซึ่งถ้าใช้ให้ดีจะลดความซับซ้อนของ code ได้
Function ในภาษา Swift เป็น first-class type
นั่นหมายความว่าฟังก์ชันสามารถมี return type
เป็นฟังก์ชันได้
และในขณะเดียวกัน สามารถรับตัวแปรที่เป็นฟังก์ชันได้
ซึ่งเราสามารถเรียกฟังก์ชันที่โยนฟังก์ชันเข้าไปในฟังก์ชันแล้วเรียกใช้งานแบบนี้ว่า Higher-order function
Function Closure
หรือ closure หรือ lexical closure คือกลุ่มของชุดคำสั่งที่สามารถเรียกใช้ทีหลังได้ ซึ่งสามารถเข้าถึงตัวแปรที่อยู่ใน scope ของ closure และ scope นอกที่ซึ่งสร้าง closure ได้
เราสามารถสร้าง closure โดยไม่ต้องประกาศชื่อ ซึ่งจะต้องครอบด้วย {}
ซึ่งสามารถรับอาร์กิวเมนต์ และคืนค่าจากฟังก์ชันได้
ซึ่ง closure สามารถเขียนได้หลากหลายรูปแบบ
ยิ่งถ้ารู้ signature ของ closure แล้ว (ดูที่อาร์กิวเมนต์และ return type) สามารถย่อรูปแบบการรับ parameters และ return type ได้
ทั้งนี้หากไม่ตั้งชื่อตัวแปร ยังสามารถอ้างอิงตัวแปรด้วยตำแหน่งของตัวแปรได้ และในตัวอย่างนี้ยังละการเขียน return เพราะการเทียบค่าด้วย >
เป็นการคืนค่าที่เป็น Boolean type อยู่แล้ว
ทั้งนี้ฟังก์ชันในภาษา Swift นั้น
- สามารถประกาศลอย ๆ โดยที่ไม่ต้องอยู่ใน class ใด ๆ ได้
- สามารถประกาศไว้ใน class ได้ (ไม่ได้พูดถึง)
- สามารถประกาศไว้ใน struct ได้ (ไม่ได้พูดถึง)
- สามารถประกาศไว้ใน enum ได้ (ไม่ได้พูดถึง)
- และที่ได้บอกไปแล้วสามารถประกาศไว้ในฟังก์ชันอื่นได้
สวัสดีครับ
อ้างอิง: https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1