What are Optional?
อย่างที่บอกว่า Optional คือประเภทของตัวแปรที่สามารถเก็บค่าที่ไม่มีค่าได้ อย่างเช่น เราอาจจะสร้างตัวแปรขึ้นมาสักตัวเพื่อรับค่าบางอย่าง แต่กลับไม่ได้รับค่าตามที่เราเขียนไว้ ตรงนี้แหละ เราสามารถนำ Optional เข้ามาจัดการได้ เพื่อบอกกับโปรแกรมเราว่า ตัวแปรนี้อาจจะมีค่าหรือไม่มีค่าก็ได้
Declaring Optional
การประกาศตัวแปรแบบ Optional ก็ทำได้ง่ายๆ เพียงเติมเครื่องหมายคำถาม ? ตามหลัง Type
var name: String? // An optional String
var age: Int? // An optional Intต่อมาเราจะไปดูวิธีการนำตัวแปรจาก Optional ไปใช้งานกัน โดยการถอดเอาตัวแปรข้างใน Optional ไปใช้เราจะเรียกวิธีการนี้ว่า Unwrap
Optional Binding
Optional binding จะเป็นวิธีการที่ปลอดภัย โดยเราจะนำ if let หรือ guard let เข้ามาช่วยเช็คค่าก่อน
if let
วิธีการนี้ก็เป็นการใช้ if else ปกติที่เราเห็นทั่วๆ ไป
if let starPath = imagePaths["star"] {
print("The star image is at '\(starPath)'")
} else {
print("Couldn't find the star image")
}
// Prints "The star image is at '/glyphs/star.png'"จากนั้นเราก็นำ starPath ไปใช้ต่อได้เลย
guard let
guard let ก็ใช้งานคล้ายๆ กับ if let จะต่างตรงที่ ถ้าไม่มีค่า จะเข้าไปทำข้างใน
guard let starPath = imagePaths["star"] else {
print("Couldn't find the star image")
}
print("The star image is at '\(starPath)'")Optional Chaining
เราสามารถ Optional chaining เข้ามาทำงานบางอย่าง อย่างเช่นในตัวอย่าง ก็คือ เช็คนามสกุล โดยที่เราไม่ต้องเข้าไปเขียนใน if เราสามารถเรียก methods ต่อได้เลย
if imagePaths["star"]?.hasSuffix(".png") == true {
print("The star image is in PNG format")
}Nil Coalescing Operator
เราสามารถกำหนดค่าให้กับตัวแปรนั้นได้ กรณีที่ตัวแปรนั้นไม่มีค่า ก็จะใช้ตัวแปรที่เรากำหนด ก็คือ เรากำหนดค่า default ให้กับตัวแปรนั้นนั่นแหละ สามารถทำได้โดยใช้เครื่องหมาย ??
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)Unconditional Unwrappingin
วิธีการนี้คือไม่สนใจอะไรทั้งนั้น บังคับแกะ Optional อย่างเดียวเพื่อให้ได้ค่าข้างใน หรือเรียกอีกอย่าง Force unwrap ถ้าแกะออกมามีค่าก็ดีไป ถ้าไม่มีก็ 💥
สามารถทำได้โดยใช้ ! ต่อท้าย
var name: String!
print(name)
// 💥