ตอนที่ 6 iOS Swift ตัวเลือก (Optionals) และการจัดการข้อผิดพลาด (Error Handling)

  1. การทำความเข้าใจตัวเลือก (Optionals) และการแกะ (Unwrapping)
  2. การผูกมัดเพิ่มเติม (Optional Chaining) และการรวมตัวกันของ Nil (Nil Coalescing)
  3. โมเดลการจัดการข้อผิดพลาด (Error Handling Model)
  4. จัดการข้อผิดพลาดใน Throwing, Catching และ Propagating

ในการรับทำแอพ iOS Swift คุณจะพบกับสถานการณ์ที่คุณจัดการกับข้อมูลที่ไม่แน่นอนหรือไม่สมบูรณ์ คุณลักษณะด้านความปลอดภัยประเภทต่างๆ ของการทำแอพ iOS Swift ช่วยให้คุณหลีกเลี่ยงข้อผิดพลาดทั่วไปโดยการจัดหาเครื่องมือที่มีประสิทธิภาพ เช่น ตัวเลือกและการจัดการข้อผิดพลาด บทความนี้จะแนะนำคุณตลอดการทำความเข้าใจเกี่ยวกับทางเลือก (Optionals) การแกะ (Unwrapping) การโยงทางเลือก (optional chaining) การรวมตัวกันของ Nil (Nil Coalescing) และการจัดการข้อผิดพลาดใน Swift

1. การทำความเข้าใจตัวเลือก (Optionals) และการแกะ (Unwrapping)

ทางเลือกคือวิธีการแสดงถึงการไม่มีค่าใน iOS Swift พวกเขาสามารถถือเป็นสิ่งห่อหุ้มรอบค่าที่อาจจะมีหรือไม่มีก็ได้ ซึ่งหมายความว่าตัวเลือกสามารถเก็บค่าหรือ nil ได้

1.1 ประกาศตัวเลือก (Declaring optionals)

หากต้องการประกาศทางเลือก ให้ใส่เครื่องหมายคำถาม?ต่อท้ายประเภท:

var name: String? // name is an optional String that is currently nil
1.2 การกำหนดค่าให้กับตัวเลือก

คุณสามารถกำหนดค่าให้กับทางเลือกได้เช่นเดียวกับตัวแปรอื่นๆ:

name = "John Doe" // name now holds the value "John Doe"
1.3 แกะตัวเลือก (Unwrapping optionals)

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

มีสองวิธีทั่วไปในการแกะตัวเลือก:

1. ใช้ if let ไวยากรณ์:

if let unwrappedName = name {
    print("Hello, \(unwrappedName)!")
} else {
    print("No name provided.")
}

2. ใช้ guard let ไวยากรณ์:

func greet() {
    guard let unwrappedName = name else {
        print("No name provided.")
        return
    }

    print("Hello, \(unwrappedName)!")
}

2. การผูกมัดเพิ่มเติม (Optional Chaining) และการรวมตัวกันของ Nil (Nil Coalescing)

2.1 การผูกมัดเพิ่มเติม (Optional Chaining)

การโยงทางเลือกเป็นวิธีที่รัดกุมในการเข้าถึงคุณสมบัติหรือเมธอดบนทางเลือกที่อาจจะ nil เป็น แทนที่จะใช้คำสั่งที่ซ้อนกันหลายรายการ if let คุณ guard let สามารถใช้การโยงทางเลือกกับ ?. ตัวดำเนินการ:

class Person {
    var pet: Pet?
}

class Pet {
    var name: String
    init(name: String) {
        self.name = name
    }
}

let person = Person()
person.pet = Pet(name: "Buddy")

let petName = person.pet?.name // petName is an optional String containing "Buddy"
2.2 การรวมตัวกันของ Nil (Nil Coalescing)

การรวมตัวกันของ Nil เป็นวิธีการให้ค่าเริ่มต้นเมื่อตัวเลือก nil คือ ตัวดำเนินการการรวมตัวกัน ?? เป็นศูนย์ใช้เพื่อบรรลุสิ่งนี้:

let defaultName = "Anonymous"
let displayName = name ?? defaultName // If name is nil, displayName will be "Anonymous"

3. โมเดลการจัดการข้อผิดพลาด (Error Handling Model)

Swift มีรูปแบบการจัดการข้อผิดพลาดที่มีประสิทธิภาพซึ่งช่วยให้คุณสามารถตรวจจับ จัดการ และเผยแพร่ข้อผิดพลาดได้อย่างสง่างาม ข้อผิดพลาดจะแสดงตามประเภทที่สอดคล้องกับ Error โปรโตคอล:

enum ValidationError: Error {
    case invalidEmail
    case passwordTooShort
}

4. จัดการข้อผิดพลาดใน Throwing, Catching และ Propagating

4.1 Throwing errors

ในการระบุว่าฟังก์ชันสามารถส่งข้อผิดพลาดได้ ให้รวม throws คีย์เวิร์ดไว้ในลายเซ็นของฟังก์ชัน:

func validate(email: String, password: String) throws {
    // Validation logic
}
4.2 Catching errors

ในการจัดการกับข้อผิดพลาดที่เกิดขึ้น คุณใช้ do-catch บล็อก:

do {
    try validate(email: "john.doe@example.com", password: "short")
} catch ValidationError.invalidEmail {
    print("Invalid email address.")
} catch ValidationError.passwordTooShort {
    print("Password is too short.")
} catch {
    print("An unexpected error occurred: \(error)")
}
4.3 Propagating errors

หากคุณต้องการเผยแพร่ข้อผิดพลาด (Propagating errors) ไปยังฟังก์ชันที่เรียกใช้ คุณสามารถใช้คีย์เวิร์ด throws ในลายเซ็น (signature) ของฟังก์ชันและคีย์เวิร์ด try เมื่อเรียกใช้ฟังก์ชัน Throw:

func signUp(email: String, password: String) throws {
    try validate(email: email, password: password)
    // Sign up logic
}

do {
    try signUp(email: "john.doe@example.com", password: "short")
} catch {
    print("An error occurred: \(error)")
}

การทำความเข้าใจเกี่ยวกับตัวเลือกเพิ่มเติม การโยงทางเลือก และการจัดการข้อผิดพลาดเป็นสิ่งสำคัญเมื่อทำงานกับ iOS Swift เครื่องมือเหล่านี้ช่วยให้คุณทำแอพที่ปลอดภัยและสะอาดขึ้น ซึ่งจัดการกับความไม่แน่นอนและข้อผิดพลาดได้อย่างสง่างาม คุณจะพร้อมรับมือกับความท้าทายในการทำแอพ iOS Swift ได้เมื่อเชี่ยวชาญแนวคิดเหล่านี้

เขียน App iOS Swift

ตอนที่ 5 iOS Swift แนะนำ Classes, Inheritance และ Protocols สำหรับ OOP
ตอนที่ 7 iOS Swift แนวคิด Swift ขั้นสูง (Advanced Swift Concepts)