การใช้ typealias และ associatedtype ใน Swift Language

Pattaravadee Luamsomboon
2 min readAug 23, 2020

สวัสดีชาวโลก กลับมาพบกันอีกแล้วในรอบครึ่งปี blog นี้ เกิดขึ้นจากการที่เราสับสนกันระหว่าง typealias กับ associatedtype เลยอยากเขียน blog นี้ขึ้นมา เพื่อย้ำความจำตัวเอง และให้คนที่เข้ามาอ่านได้รู้จักทั้ง 2 อย่างนี้ด้วย ถ้าหากไม่เคยรู้จักมาก่อน แต่ถ้าอ่านแล้วยังงงๆ ไม่เข้าใจอยู่ ตามสโลแกนเดิมจาก blog ที่แล้วเลย มาทำงานที่ FINNOMENA ดิ เดี๋ยวเราสอนให้ 😁😁😁

สำหรับสิ่งที่จะพูดถึงในวันนี้ก็จะมี

  • typealias คืออะไร
  • ตัวอย่างการใช้ typealias
  • associatedtype คืออะไร
  • ตัวอย่างการใช้ associatedtype

typealias คืออะไร

typealias ก็คือสิ่งที่เราจะตั้งชื่อใหม่ให้กับ type ที่มีอยู่แล้ว ไม่ว่าจะเป็น

  • built-in type เช่น Int, String เป็นต้นใบ
  • User-defined types เช่น class, struct, protocol เป็นต้นไม้
  • Complex types เช่น closures เป็นต้นอะไรดี

หลังจากที่เราตั้งชื่อให้กับ type เดิมเราแล้ว เราก็จะสามารถเรียกชื่อที่เราตั้งให้แทน type เดิมได้เลย

ตัวอย่างการใช้ typealias

  • การใช้ typealias กับ built-in type
typealias SpouseFirstName = Stringtypealias SpouseID = Int
let name: SpouseFirstName = "Ravin"let id: SpouseID = 1
  • การใช้ typealias กับ User-defined types
protocol AppDelegateViewModelInput {
func setUserDefaultForUITesting()
}
typealias Input = AppDelegateViewModelInputclass AppDelegateViewModel: Input {
func setUserDefaultForUITesting() {
}
}
  • การใช้ typealias กับ Complex types
typealias ViewControllerCallback = (UIViewController) -> Voidvar onViewControllerShowed: ViewControllerCallback = { _ in }

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

associatedtype คืออะไร

ส่วนนี้เราจะพูดถึง Protocols with Associated Types ซึ่ง associatedtype เป็นตัวแปรที่จะถูกใช้ใน protocol และตัวแปรใน protocol นั้นๆ สามารถรับ type อะไรเข้ามาก็ได้ เป็นเหมือน placeholder ของ type นั้นๆ ไว้ ซึ่งการใช้งานแบบนี้เป็นหนึ่งในเรื่อง Generics นั่นเอง จริงๆ Generics เป็นเรื่องใหญ่ๆ ที่มีหลายส่วน 1 ในนั้น เราเคยเขียน blog ไว้ เป็นของ Generics function สามารถอ่านได้ที่นี่

ตัวอย่างการใช้ associatedtype

จากในโค้ดจะเห็นว่าเรามี protocol ที่ชื่อว่า Student และใน Student จะมี idList ซึ่งเป็น array ของ associatedtype ที่เราตั้งชื่อว่า ID นั่นเอง และเมื่อเรามาดูใน struct Room1 ที่ conform Student protocol มา เราจะเห็นว่า idList ที่ถูกใส่เข้าไปจะเป็น string array และ room1 ก็สามารถเรียก func show ที่แสดงของที่อยู่ใน idList ได้ พอมาดู struct Room2 ที่ conform Student protocol เหมือนกับ Room1 แต่สิ่งที่ต่างกันคือ idList ใน Room2 จะเป็น int array และสามารถเรียก func show ได้เหมือนกัน

นี่คือประโยชน์ของ Generics เลยแหละ ทำให้ทุกอย่างยืดหยุ่นได้ บาง class จะ conform protocol ได้เหมือนกันอยู่แล้ว แต่ตัวแปรดันคนละ type จากที่เราอาจต้องเขียน protocol มาเพิ่มเพื่อ support แต่ละ type ให้ตัวแปรนั้น เราก็สามารถใช้ associatedtype นี่แหละได้เลย 👏🏻👏🏻👏🏻

เอาล่ะมาถึงตรงนี้แล้ว หวังว่าทุกคนจะพอเข้าใจ 2 สิ่งนี้ได้มากขึ้นและไม่จำสับสนกันแบบเรานะ 😂😂😂

--

--