Swift: การรับมือกับค่า nil ด้วย Optional

Programming

Swift: การรับมือกับค่า nil ด้วย Optional

nil คือประเภทของตัวแปรประเภทหนึ่ง เพื่อเก็บค่าที่ไม่มีค่า เอ๊ะ! ยังไง มาลองดูในบทความนี้กัน

ประมาณ 1 ปีที่ผ่านมา

1 min read

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

Tags:

Swift