ก่อนจะไปพบกับบทความแรกของ ThaiSwiftClass.com ก็ต้องขอสวัสดีปีใหม่กับมิตรรักชาวสวิฟท์ทุกท่าน 🙂 ไปเที่ยวไหนกันมาบ้างครับ? สำหรับผมก็คิดบทความ ชุดคำสั่งใหม่ๆสำหรับใช้สวิฟท์มาฝากกันครับ
มาเริ่มตอนแรกต้อนรับปีใหม่กันเลย เป็นเรื่องราวของการใช้งาน guard (การ์ด) ใน Swift 2.0 ที่สามารถจะนำมาใช้ตรวจสอบเงื่อนไขได้แทน if else ได้อย่างดีเลยทีเดียว ลองไปดูตัวอย่างกันนะครับ
เคยเจอเหมือนกันที่ต้องใช้ if else ตรวจสอบอะไรวุ่นวายแบบนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
if sUser != "" { print("Valid User") if sPassword != "" { print("Valid Password") if sEmail != "" { print("Valid Email") if sCapcha == "sweet" { print("success register") } else { print("Invalid Capcha") } } else { print("Invalid Email") } } else { print("Invalid Password") } } else { print("Invalid User") } |
หรือที่เขาเรียนกันว่า Pyramid of Doom คือแทบจะผูกเงื่อนไขซ้อนๆกันไป
แต่ตอนนี้เรามีผู้ช่วยใหม่ที่จะทำให้โค๊ดดูง่ายขึ้นกว่าเดิม ให้เราลองเปลี่ยนมาใช้ guard กัน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
guard sUser != "" else { print("Invalid User") exit(1) } print("Valid User") guard sPassword != "" else { print("Invalid Password") exit(1) } print("Valid Password") guard sEmail != "" else { print("Invalid Email") exit(1) } print("Valid Email") guard sCapcha != "" else { print("Invalid Capcha") exit(1) } print("Successfully Login") |
จะเห็นได้ว่าเงื่อนไขแต่ละอย่างจะถูกจับแยกออกมาให้ดูง่ายขึ้น
ลองมาดูโครงสร้างของ guard ว่ามีที่มาที่ไปยังไง
guard ตรวจสอบเงื่อนไขเป็นจริง where โดยตรวจสอบเงื่อนไขอื่นๆร่วมไปด้วย else { เมื่อเงื่อนไขไม่เป็นจริงให้ทำอะไร จากนั้นต้องจบด้วย return (เมื่อใช้งานใน function) throw Errortype break (เมื่อใช้งานใน switch) exit(1) (เมื่อใช้งานทั่วไป) } ชุดคำสั่งทำงานต่อไปเมื่อเงื่อนไขเป็นจริง **ถ้าเงื่อนไขไม่เป็นจริงระบบจะทำงานที่ else เสร็จแล้วจะไม่ทำงานที่เหลือหลังจากนั้นอีกเลย |
ข้อดีของ guard อีกข้อนึงคือเมื่อเราทำ optional binding เราสามารถนำตัวแปรนั้นไปใช้ต่อได้ ลองดูตัวอย่างต่อไปครับ
1 2 3 4 5 6 7 8 9 10 11 |
var sDict : Dictionary<String,String> = ["A":"Ant","B":"Bat","C":"Cat"] print(sDict["A"]) if let sCheck = sDict["A"] { print(sCheck) } else { print("no value found") } |
ผลของการทำงาน
Optional(“Ant”)
Ant |
จะเห็นได้ว่าการทำงานกับ Dictionary และอีกหลายๆอย่างใน Swift (เช่นพวก TextBox) จำเป็นต้องใช้ optional binding หรือ การใช้ “if let…” เพื่อตรวจสอบว่าค่าที่ได้มานั้นไม่ใช้ nil และสามารถนำไปใช้ต่อได้
แต่จากตัวอย่าง เราจะไม่สามารถนำ sCheck ที่ได้มาไปใช้หลังจากจบ if else ไปใช้ต่อได้อีกเพราะถือว่าจบการทำงานของ optional binding แล้ว
ถ้าลองเปลี่ยนมาใช้ guard ดูบ้างล่ะ?
1 2 3 4 5 6 7 8 9 |
var bLoginSuccess : Bool = true guard let sCheck = sDict["A"] where bLoginSuccess == true else { print("no value found") exit(1) } print("sCheck = \(sCheck)") |
ผลการทำงาน
sCheck = Ant |
ก็ผ่านไปแล้วอีกหนึ่งบทเรียนจาก ThaiSwiftClass ยังไงลองเอาไปใช้ดูกันนะครับ ได้ผลดียังไงก็มาบอกหรือแนะนำกันได้ครับ
แนะนำติชมได้ตลอดนะครับ ที่ thaiswiftclass@gmail.com และทาง https://www.facebook.com/thaiswiftclass