ว่าด้วย function ในภาษา Swift

Wasith T. (Bai-Phai)
odds.team
Published in
2 min readJul 1, 2018

function (ฟังก์ชัน)

ในภาษา Swift สามารถเขียนได้โดย ขึ้นต้นด้วยคำว่า func แล้วเว้นวรรคตามด้วยชื่อฟังก์ชัน ตัวฟังก์ชันสามารถรับ arguments (อาร์กิวเมนต์) ได้ใน parentheses (วงเล็บ) หลังจากชื่อฟังก์ชัน และหากมี return value ให้ใช้ -> ซึ่งต้องเว้นวรรค

หลังจากวงเว็บเล็บและเว้นวรรค แล้วตามด้วย return type

อ่านแล้วงงมั้ยครับ 555 ไปดูตัวอย่างเลยดีกว่า

รูปที่ 1: บรรทัดที่ 1–3 เป็น ฟังก์ชัน และ 4 เป็นตัวอย่างการเรียกใช้

โดย default (โดยปริยาย) การเรียกใช้ฟังก์ชันจะต้องระบุ argument label (ชื่ออาร์กิวเมนต์) ด้วยดังในรูปที่ 1 หากในการเรียกใช้ต้องการเรียกใช้สามารถใช้ _ ข้างหน้าชื่ออาร์กิวเมนต์เพื่อเพิกเฉย หรือสามารถปรับชื่ออาร์กิวเมนต์ (custom argument label) โดยการใส่ชื่อไว้ข้างหน้าแทน

หมายเหตุ: พอดีไม่สามารถหานิยามภาษาไทยของ argument label ได้ครับ 555 จะแปล label ว่าป้ายก็เกรงใจ

รูปที่ 2: ใช้ _ เพื่อเพิกเฉยชื่อ และใช้ on แทน day ซึ่งภายในฟังก์ชันจะเรียก day แต่ภายนอกจะเรียก on

Nested Function

ในภาษา Swift เองสามารถประกาศฟังก์ชันไว้ภายในฟังก์ชัน และสามารถเรียกใช้ได้ตามตัวอย่างในรูปที่ 3 ซึ่งจะเรียกแบบนี้ว่า nested function

โดย nested function สามารถเข้าถึงตัวแปรที่อยู่ในฟังก์ชันด้านนอกได้ ซึ่งถ้าใช้ให้ดีจะลดความซับซ้อนของ code ได้

รูปที่ 3: ฟังก์ชันภายในฟังก์ชัน

Function ในภาษา Swift เป็น first-class type

นั่นหมายความว่าฟังก์ชันสามารถมี return type เป็นฟังก์ชันได้

รูปที่ 4: ฟังก์ชันที่คืนค่าเป็นฟังก์ชัน

และในขณะเดียวกัน สามารถรับตัวแปรที่เป็นฟังก์ชันได้

รูปที่ 5: ฟังก์ชันที่รับฟังก์ชันในรูปของตัวแปร

ซึ่งเราสามารถเรียกฟังก์ชันที่โยนฟังก์ชันเข้าไปในฟังก์ชันแล้วเรียกใช้งานแบบนี้ว่า Higher-order function

Function Closure

หรือ closure หรือ lexical closure คือกลุ่มของชุดคำสั่งที่สามารถเรียกใช้ทีหลังได้ ซึ่งสามารถเข้าถึงตัวแปรที่อยู่ใน scope ของ closure และ scope นอกที่ซึ่งสร้าง closure ได้

เราสามารถสร้าง closure โดยไม่ต้องประกาศชื่อ ซึ่งจะต้องครอบด้วย {} ซึ่งสามารถรับอาร์กิวเมนต์ และคืนค่าจากฟังก์ชันได้

รูปที่ 6: ตัวอย่าง closure

ซึ่ง closure สามารถเขียนได้หลากหลายรูปแบบ

ยิ่งถ้ารู้ signature ของ closure แล้ว (ดูที่อาร์กิวเมนต์และ return type) สามารถย่อรูปแบบการรับ parameters และ return type ได้

รูปที่ 7: ตัวอย่าง closure

ทั้งนี้หากไม่ตั้งชื่อตัวแปร ยังสามารถอ้างอิงตัวแปรด้วยตำแหน่งของตัวแปรได้ และในตัวอย่างนี้ยังละการเขียน return เพราะการเทียบค่าด้วย > เป็นการคืนค่าที่เป็น Boolean type อยู่แล้ว

รูปที่ 8: ตัวอย่าง closure ใช้ตำแหน่งของตัวแปรแทนชื่อตัวแปร
รูปที่ 9: ใช้ฟังก์ชัน > เป็นตัวแปรโยนเข้าไปใน ฟังก์ชั่น sorted(by:)

ทั้งนี้ฟังก์ชันในภาษา Swift นั้น

  • สามารถประกาศลอย ๆ โดยที่ไม่ต้องอยู่ใน class ใด ๆ ได้
  • สามารถประกาศไว้ใน class ได้ (ไม่ได้พูดถึง)
  • สามารถประกาศไว้ใน struct ได้ (ไม่ได้พูดถึง)
  • สามารถประกาศไว้ใน enum ได้ (ไม่ได้พูดถึง)
  • และที่ได้บอกไปแล้วสามารถประกาศไว้ในฟังก์ชันอื่นได้

สวัสดีครับ

อ้างอิง: https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1

--

--

Wasith T. (Bai-Phai)
odds.team

ตบมือเป็นกำลังใจให้ผมด้วยนะครับ 😘