ตัวแปรแบบ Optional

     ตัวแปรแบบ Optional    

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

ก่อนที่จะมาดูตัวอย่างเพื่อเห็นภาพชัดเจนยิ่งขึ้นว่า Optional ประกาศอย่างไรและ nil คืออะไร? ให้มาลองเปรียบเทียบกับวิธีการประกาศตัวแปรปกติก่อนครับ

ตัวอย่าง : ประกาศตัวแปร iNonOptional ประเภท Int แล้วใช้งานทันที

ThaiSwiftClass Optionals Error Non Optional Result

ThaiSwiftClass Optionals Error Non Optional Result

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

การประกาศตัวแปรแบบ Optional

การประกาศตัวแปรแบบนี้เราจะต้องใส่เครื่องหมาย “?” ต่อท้ายประเภทตัวแปรที่ต้องการทำ Optional

ThaiSwiftClass Optional variable

ThaiSwiftClass Optional variable

ThaiSwiftClass Optional Nil

ThaiSwiftClass Optional Nil

ผลจากการทำงานเราจะเห็นว่าตัวแปร iTestNil จะมีค่าที่เรียกกันว่า “nil” หรือจริงๆมันก็คือค่าว่าง (nothing) ขึ้นมา แถมโปรแกรมก็ไม่ฟ้อง error ใดๆ

เราสามารถ if..else มาช่วยตรวจสอบว่าตัวแปรดังกล่าวเป็น nil หรือไม่? โดยสามารถเขียนได้ 2 วิธี

วิธีแรก : ใช้ “== nil” เพื่อเช็กตามเงื่อนไขว่าเป็น nil หรือไม่..

ThaiSwiftClass Optional using if else test nil

ThaiSwiftClass Optional using if else test nil

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

ThaiSwiftClass Optional nil result

ThaiSwiftClass Optional nil result

 

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

(วิธีที่สองเป็นวิธีที่นิยมในการตรวจสอบเงื่อนไข เช่นการค้นหาค่าที่อยู่ใน Dictionary )

ThaiSwiftClass Optional using if else test nil 2

ThaiSwiftClass Optional using if else test nil 2

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

ThaiSwiftClass Optional nil result

ThaiSwiftClass Optional nil result

 

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

ThaiSwiftClass Optional using if else test with value

ThaiSwiftClass Optional using if else test with value

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

ThaiSwiftClass Optionals value result 2

ThaiSwiftClass Optionals value result 2

….ถ้าดูจาก output จะเห็นว่าผลที่ได้จะมี Optional(“”) ครอบผลของตัวแปรไว้อีกที…แล้วแบบนี้เราจะแกะค่าออกมายังไงดี?

 

Swift จะมีตัวแปรประเภท Optional อีกตัวที่เรียกว่า “Implicitly Unwrapped Optionals” 

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

อธิบายให้ง่ายๆคือเจ้าตัวแปรประเภทนี้เป็น Optionals ที่ Unwrapped หรือเปิดห่อเอาค่าที่อยู่ครอบใน Optional ออกมาใช้งาน

ลองมาดูตัวอย่างให้เข้าใจมากขึ้น

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals nil

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals nil

ผลการทำงาน

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals nil result

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals nil result

จากตัวอย่าง เราได้ประกาศตัวแปร var sIUOptionals : String!   ตัวแปรนี้จะเป็น Implicitly Unwrapped Optionals เพื่อประกันว่าตัวแปรดังกล่าวแม้เป็น Optional และมี nil  เมื่อไม่กำหนดค่าใดๆในตอนแรก แต่เวลานำไปใช้จริงต้องทำการใส่ค่าให้ก่อนเพราะจะต้องเปิดห่อของ Optional ออกมา

ข้อควรระวัง!!…ถ้าเปิดห่อ (Unwrapped) ออกมาแล้วเจอ nil จะ error ทันที..

จากตัวอย่างข้างล่างเราลองนำมาเปิดห่อโดยการใช้ “!” ต่อท้ายตัวแปร sIUOptionals ที่ยังไม่ได้กำหนดค่าใดและมีสถานะเป็น nil อยู่ เปิดห่อออกมา (Unwrapped) ก็ไม่เจออะไร Swift จึงฟ้อง Error ดังกล่าว

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals Error

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals Error

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals Error result

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals Error result

 

 

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

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals value

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals value

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

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals value result

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals value result

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

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

ThaiSwiftClass Optional Using Implicitly Unwrapped Optionals for get value from iTestNil

ThaiSwiftClass Optional Using Implicitly Unwrapped Optionals for get value from iTestNil

ผลที่ได้

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals value result 2

ThaiSwiftClass Optionals Implicitly Unwrapped Optionals value result 2

 

สรุปจากที่เรียนมา ในเรื่อง 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

 

 

 

 

 

 

 

Leave a Reply