Swift’s enum with RESTful request
Enum คือการ Custom type รูปแบบหนึ่ง ประโยชน์ของการ Custom type มีอยู่หลายประการ ทำให้โค้ดเราสวยงามอ่านง่าย (ตามชื่อ Type ที่เรา Custom ขึ้น) แต่ข้อดีที่สำคัญอีกข้อคือ “การ filter value ที่นอกเหนือจาก การทำงานของ function ได้”
เทียบ Interface ของฟังก์ชั่นออก Report ในแต่ละเดือน แบบที่ใช้ Enum และ ไม่ใช้ Enum
เห็นได้ว่าว่า แบบที่ใช้ Enum โค้ดอ่านง่ายและตรงไปตรงมากว่า รวมถึงความปลอดภัยในการส่ง Parameter ว่ามันจะไม่เกินเดือนธันวาคมไปแน่นอน เพราะมันกรอกได้แค่ December ในขณะที่แบบแรก อาจจะเกิดการส่งค่าอย่าง self.reportFor(14) ซึ่งไม่ถูกต้องก็ได้
Value จริงๆของ Enum ใน Objective-C จะเป็น int เท่านั้น ไม่สามารถกำหนดเป็น Type อื่นได้ การใช้งาน Enum ของผมที่ผ่านมา จึงเป็นการใช้ควบคู่กับ State ที่เปลี่ยนไปได้ซะมากกว่า …แต่ Enum ใน Swift มันเป็นได้มากกว่านั้นเยอะเลยครับ มันเจ๋งมาก!!
ความสามารถของ Enum ใน Swift ที่เหนือกว่าใน Objective-C ที่ผมจะเขียนถึงใน Entry นี้คือ (1) กำหนด Type อื่นๆได้นอกเหนือจาก Int และ (2) Enum สามารถส่ง Parameter เฉพาะ Type นั้นๆได้ด้วย (Associative Enum) ซึ่งผมจะใช้กับเคสที่น่าจะใช้บ่อยที่สุด การ “Call API”
สมมุติว่า เป็น Rest API ของการ Post Blog รายละเอียดดังนี้
Host : Staging => http://staging.myblog.com/api, Production => https://myblog.com/api
Method : /blog
Read blog — GET /blog/:id
Create blog — POST /blog, body: title=<string>&body=<string>
Update blog — UPDATE /blog/:id, body: title=<string>&body=<string>
Delete blog — DELETE /blog:id
เริ่มจากประโยชน์ของการกำหนด Type ชนิดอื่นๆนอกเหนือจาก Int ในข้อ (1) ผมจะนำมาใช้ในการกำหนด url ของ host ว่าจะเรียก API จาก staging หรือ production ดังนี้
จากโค้ดข้างบน ผมสามารถกำหนดได้แล้วว่า แอพจะไปเรียก API ที่ staging หรือ production
API.host = .Staging
ต่อมาก็จะเป็นเรื่องของการ request API /blog ถ้าเขียนตามปกติ ก็อาจจะใช้วิธีการ แยกฟังก์ชั่น ว่าฟังก์ชั่นนี้สำหรับ Post หรือสำหรับ get เพราะแต่ละ method ก็มีความแตกต่างกันทั้ง Parameter และ HTTP method ที่ต่างกันไป แต่ด้วย Associative enum เราสามารถรวบไว้เป็นฟังก์ชั่นเดียว และมองว่า function blog คือการเชื่อต่อกับ API /blog ได้ดังนี้
ผมรวบ method ทั้งหมดของ API blog ไว้ที่ฟังก์ชั่นเดียว และใช้คุณสมบัติของ Enum associate กำหนด parameter ที่ต้องส่งมาในแต่ละ action เท่านี้ก็สามารถลดความซ้ำซ้อนในการสร้าง function ได้แล้ว
การเรียกใช้ ผมก็เรียกแค่ฟังก์ชั่นเดียว ส่วนจะทำ Action ไหน Parameter อะไร ก็ดูเอาจากที่ Enum กำหนดไว้
สำหรับ Swift’s enum ผมขอพักไว้เท่านี้ก่อน ยังมีอะไรน่าสนใจอยู่อีก ไว้จะมาเขียนถึงใน Entry ต่อๆไป
Happy Coding ครับ :)
Reference :
- Apple’s Swift development documentation
Update July 26,15 :: แก้ส่วนที่บอกว่า Associate enum กำหนด Name ไม่ได้ จริงๆแล้วกำหนดได้ครับ