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)
// 💥