September 18, 2015

Swift: Enums กับ Associated Values

ใน Objective-C เราสามารถอ้างถึงค่าของสมาชิกใน enum ได้ ซึ่งเราจะได้ integer กลับมา แต่ว่าด้วยฟีเจอร์ associated value ของ Enum ใน Swift นั้นทำให้เราสามารถกำหนดค่าที่ต่างชนิดกันได้ให้กับสมาชิกใน enum เช่น สมาชิกใน enum ตัวหนึ่งอาจเก็บค่าชนิด Integer ส่วนอันหนึ่งเก็บค่าชนิด String  และอีกอย่างหนึ่งก็คือค่าของสมาชิกใน enum ที่ประกาศเป็น associated value จะถูกกำหนดให้ตอนที่ค่าของ enum ถูกสร้างขึ้นมา ไม่ใช่ตอนประกาศ เพราะตอนประกาศเราจะประกาศแค่ชื่อ และชนิดข้อมูลที่เก็บเท่านั้น ส่วนตัวอย่างที่หลายที่มักหยิบยกมากัน ก็คือการนำไปใช้กับรูปแบบโค้ดที่ต้อง return ค่ากลับออกมาต่างชนิดกันนั่นเอง

ยกตัวอย่างโค้ดการทำงานของบัญชีธนาคาร ที่มีจำนวนเงินเก็บไว้จำนวนหนึ่ง และมี method ที่ใช้สำหรับถอนเงินออกมา โดยที่ ถ้าจำนวนเงินที่ต้องการถอนมีจำนวนมากกว่าเงินที่เก็บไว้ ก็จะ return error message string ออกมา แต่ถ้าหากจำนวนเงินสามารถถอนออกมาได้จริง ก็จะ return จำนวนเงินคงเหลือออกมา

ถึงตรงนี้เราจะพบว่าค่าที่ถูก return กลับออกมานั้นมี type ที่แตกต่างกัน อันหนึ่งเป็น String และอีกอันหนึ่งเป็น Integer เจอแบบนี้ เราสามารถใช้ enum เข้ามาช่วยได้โดยการออกแบบ enum เตรียมไว้ก่อนได้ดังนี้


เราประกาศ enum ชนิด WithdrawalResult ซึ่งได้กำหนดสมาชิกใน enum ไว้ให้ครอบคลุมทั้ง 2 กรณีที่อาจเกิดขึ้นได้ และพบว่าสมาชิก enum แต่ละตัวจะมี type ที่แตกต่างกันออกไป โดยที่เราจะยังไม่กำหนดค่าให้สมาชิกของ enum ตอนประกาศในตอนนี้ และนี่คือโค้ด function withdraw ที่นำ enum ที่เราประกาศไว้ตอนแรกมาใช้งาน สำหรับการถอนเงินจากบัญชีธนาคารที่เราได้พูดถึงไว้ตอนแรก


function withdraw รับจำนวนเงินที่ต้องการถอนเข้ามา จากนั้นตรวจสอบว่าถอนได้หรือไม่ แล้วก็ return ข้อมูลชนิด WithdrawalResult ออกไป ซึ่งค่าที่เป็นไปได้ของ WithdrawalResult ก็คือ .Success และ .Error ถ้าหากตรวจพบว่าถอนได้ก็จะ return .Success ออกไป หากถอนไม่ได้ .Error จะถูก return ออกไป

และตรงนี้นี่เองเราจะพบว่าเมื่อไรก็ตามที่เราอ้างถึงสมาชิกใน enum เราจำเป็นต้องกำหนดข้อมูลตาม associate type ที่เราได้ประกาศไว้ไปด้วยเสมอ เมื่อเราอ้างถึง .Success เราจำเป็นต้องกำหนดข้อมูลชนิด Int (จำนวนยอดเงินคงเหลือ) และด้วยกรณีเดียวกันเมื่อเราอ้างถึง .Error เราก็ต้องกำหนดข้อมูลชนิด String (error message) ด้วยเช่นกัน

คราวนี้เพื่อให้เห็นภาพ เราลองมาดูวิธีการใช้งานดู


หากพบว่าเราต้องสร้าง function ที่มี return type มากกว่า 1 ชนิด รูปแบบโค้ดแบบนี้ก็น่าสนใจไม่น้อยเลยทีเดียว บทความนี้เอาเนื้อหามาจากที่นี่  Learn Swift by example - Part 2: Enums นอกจากเรื่องที่ยกมาเขียนถึงแล้ว เค้ายังพูดถึงเรื่องอื่นๆ ของ Enums อีก ตามไปอ่านได้เลย