ตัวแปรแบบ Optional
ตัวแปรแบบ Optional คือการประกาศตัวแปรเพื่อที่จะรองรับตัวแปรนั้นๆอาจจะเป็น “ค่าว่าง” (ใน Swift จะเรียกว่า “nil” ) อยู่ก็เป็นได้ ส่วนใหญ่แล้วจะใช้กับเวลาเราค้นหาข้อมูลที่อยู่ในตัวแปรแบบ Dictionary, ใน Function บางประเภท ,ใน Class (บทต่อๆไปจะสอนเรื่อง Class ซึ่งจะเกี่ยบกับ OOP) หรือต้องการตรวจสอบก่อนนำไปใช้งาน
ก่อนที่จะมาดูตัวอย่างเพื่อเห็นภาพชัดเจนยิ่งขึ้นว่า Optional ประกาศอย่างไรและ nil คืออะไร? ให้มาลองเปรียบเทียบกับวิธีการประกาศตัวแปรปกติก่อนครับ
ตัวอย่าง : ประกาศตัวแปร iNonOptional ประเภท Int แล้วใช้งานทันที

จากตัวอย่างจะเห็นว่าจะเกิดข้อผิดพลาดของโปรแกรมขึ้นทันทีและจะทำงานต่อไม่ได้ถ้าไม่แก้ไขโดยการใส่ค่าให้แก่ตัวแปรหรือต้องประกาศเป็นแบบ Optional
การประกาศตัวแปรแบบ Optional
การประกาศตัวแปรแบบนี้เราจะต้องใส่เครื่องหมาย “?” ต่อท้ายประเภทตัวแปรที่ต้องการทำ Optional


ผลจากการทำงานเราจะเห็นว่าตัวแปร iTestNil จะมีค่าที่เรียกกันว่า “nil” หรือจริงๆมันก็คือค่าว่าง (nothing) ขึ้นมา แถมโปรแกรมก็ไม่ฟ้อง error ใดๆ
เราสามารถ if..else มาช่วยตรวจสอบว่าตัวแปรดังกล่าวเป็น nil หรือไม่? โดยสามารถเขียนได้ 2 วิธี
วิธีแรก : ใช้ “== nil” เพื่อเช็กตามเงื่อนไขว่าเป็น nil หรือไม่..

ผลการการทำงาน

วิธีที่สอง เราใช้สูตรสร้างตัวแปรลอยๆชื่อ CheckNotNil มาขอค่าจาก iTestNil ถ้าเงื่อนไขแรกเป็นจริงแสดงว่า iTestNil มีค่าและไม่ใช่ nil
(วิธีที่สองเป็นวิธีที่นิยมในการตรวจสอบเงื่อนไข เช่นการค้นหาค่าที่อยู่ใน Dictionary )

ผลการการทำงาน

ทีนี้เราลองใส่ค่าลงไปในตัวแปร iTestNil แล้วตรวจสอบอีกครั้ง

มาดูผลที่ได้กัน

….ถ้าดูจาก output จะเห็นว่าผลที่ได้จะมี Optional(“”) ครอบผลของตัวแปรไว้อีกที…แล้วแบบนี้เราจะแกะค่าออกมายังไงดี?
Swift จะมีตัวแปรประเภท Optional อีกตัวที่เรียกว่า “Implicitly Unwrapped Optionals”
ตัวแปรที่เป็น “Implicitly Unwrapped Optionals” ต่างกันที่ตัวแปรนั้นๆจะใช้สัญลักษณ์ “!” ต่อท้ายขนิดของตัวแปรก่อนนำไปใช้งาน และที่สำคัญถ้าจะนำไปใช้งานจะต้องมี “ค่า” เสมอ แต่เหมือนกับ Optionals ธรรมดาคือตอนแรกที่ประกาศจะได้ค่าเป็นแค่ nil (ในกรณีที่ไม่ได้ให้ init ค่าไว้นะครับ)
อธิบายให้ง่ายๆคือเจ้าตัวแปรประเภทนี้เป็น Optionals ที่ Unwrapped หรือเปิดห่อเอาค่าที่อยู่ครอบใน Optional ออกมาใช้งาน
ลองมาดูตัวอย่างให้เข้าใจมากขึ้น

ผลการทำงาน

จากตัวอย่าง เราได้ประกาศตัวแปร var sIUOptionals : String! ตัวแปรนี้จะเป็น Implicitly Unwrapped Optionals เพื่อประกันว่าตัวแปรดังกล่าวแม้เป็น Optional และมี nil เมื่อไม่กำหนดค่าใดๆในตอนแรก แต่เวลานำไปใช้จริงต้องทำการใส่ค่าให้ก่อนเพราะจะต้องเปิดห่อของ Optional ออกมา
ข้อควรระวัง!!…ถ้าเปิดห่อ (Unwrapped) ออกมาแล้วเจอ nil จะ error ทันที..
จากตัวอย่างข้างล่างเราลองนำมาเปิดห่อโดยการใช้ “!” ต่อท้ายตัวแปร sIUOptionals ที่ยังไม่ได้กำหนดค่าใดและมีสถานะเป็น nil อยู่ เปิดห่อออกมา (Unwrapped) ก็ไม่เจออะไร Swift จึงฟ้อง Error ดังกล่าว


ทีนี้เราลองมาใส่ค่าให้ตัวแปร sIUOptionals ดูแล้วแสดงออกหน้าจอ

มาดูผลที่ได้จากการ Run

จะเห็นได้ว่า “I am alive” ไม่ถูกครอบด้วยคำว่า Optional() เพราะเราใช้ “!” เพื่อแกะค่าที่ได้ออกมาใช้งานเลยตั้งแต่ตอนประกาศตัวแปรแล้ว
กลับที่ตัวแปร iTestNil ซึ่งประกาศไว้ตอนแรกและตอนนี้มีค่าเป็น Optional(4321) เราสามารถแกะค่านี้ออกมาโดยใช้ “!” ต่อท้ายตัวแปร iTestNil ตามตัวอย่างต่อไปนี้

ผลที่ได้

สรุปจากที่เรียนมา ในเรื่อง Optional
1. การประกาศ “?” ต่อท้ายชนิดของตัวแปรจะเรียกว่าเป็น Optional และจะมีค่าเริ่มแรกให้คือ nil (หรือค่าว่าง) ซึ่งสามารถใช้ Condition อย่าง if else ไปตรวจสอบก่อนใช้งานจริง
2. การใช้ “!” ต่อท้ายตัวแปรที่เป็น Optional จะเรียกว่า Implicitly Unwrapped Optionals หรือการแกะห่อนำค่าที่มีอยู่ใน Optionals นั้นๆออกมาใช้งาน ซึ่งจะต้องไม่ใช่ nil ไม่งั้น error แน่นอน
3. การประกาศ “!” ต่อท้ายชนิดตัวแปรแต่แรกเลย เวลาไปใช้งานจริงก็ไม่ต้องใช้ “!” ต่อท้ายตัวแปรเพื่อแกะห่ออีกรอบเพราะมันเป็น Optional ที่ถูกแกะห่อแต่แรกแล้ว
ในเรื่อง Optional นั้นมีประโยชน์อยู่หลายๆประการและในบทลึกๆต่อไปจะเห็นประโยชน์มากขึ้น ยิ่งเวลาเราเขียนแอพหรือโปรแกรมจริงๆจังอาจต้องนำ Optional (“?”) หรือ Implicit Unwrapped Optionals (“!”) มาใช้เพื่อตรวจสอบค่าที่เราต้องการอย่างเลี่ยงไม่ได้ทีเดียว
แนะนำติชมได้ตลอดนะครับ ที่ thaiswiftclass@gmail.com และทาง https://www.facebook.com/thaiswiftclass