0Pricing
Swift Academy · บทเรียน

การแปลงชนิดแบบมีเงื่อนไขด้วย as?

ลองแปลงชนิดโดยให้ผลลัพธ์เป็นค่าเสริมเมื่อแปลงไม่สำเร็จ

การแปลงชนิดแบบมีเงื่อนไขด้วย as? เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

การแคสต์แบบมีเงื่อนไข

ตัวดำเนินการ แคสต์แบบมีเงื่อนไข as? จะพยายามแคสต์ลงและคืนค่าทางเลือก โดยห่อหุ้มค่าไว้เมื่อสำเร็จ หรือคืนค่า nil เมื่อล้มเหลว

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let maybe = a as? Dog
print(maybe != nil)

ผลลัพธ์เป็นค่าทางเลือก

เนื่องจากการแคสต์อาจล้มเหลว ชนิดของผลลัพธ์จึงเป็น Dog? ไม่ใช่ Dog คุณต้องแกะค่าทางเลือกก่อนใช้งาน

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let maybe: Dog? = a as? Dog
print(type(of: maybe))

การแกะค่าด้วย if let

วิธีใช้ as? ตามรูปแบบของ Swift คือใช้ภายในการผูกค่าด้วย if let ซึ่งจะทำงานในบล็อกก็ต่อเมื่อการแคสต์สำเร็จ

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
if let dog = a as? Dog {
    print(dog.bark())
} else {
    print("Not a dog")
}

การแคสต์ที่ล้มเหลวคืนค่า nil

เมื่ออินสแตนซ์ไม่ใช่ชนิดเป้าหมาย as? จะให้ค่า nil และข้ามบล็อกของ if let

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Cat(name: "Mia")
if let dog = a as? Dog {
    print(dog.bark())
} else {
    print("That is not a dog")
}

การใช้ร่วมกับ guard let

คุณยังสามารถใช้ guard let เพื่อแคสต์ตั้งแต่ต้นและออกจากการทำงานหากแคสต์ล้มเหลว ทำให้เส้นทางกรณีสำเร็จไม่ต้องเยื้องระดับ

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
func describe(_ a: Animal) {
    guard let cat = a as? Cat else {
        print("Not a cat")
        return
    }
    print(cat.meow())
}
describe(Cat(name: "Mia"))
describe(Dog(name: "Rex"))

การแคสต์แบบมีเงื่อนไขในลูป

การวนซ้ำอาร์เรย์ที่มีหลายชนิดและแคสต์สมาชิกแต่ละตัวแบบมีเงื่อนไข เป็นวิธีที่ชัดเจนในการจัดการคลาสย่อยต่าง ๆ อย่างปลอดภัย

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let zoo: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia"), Dog(name: "Buddy")]
for a in zoo {
    if let dog = a as? Dog {
        print(dog.bark())
    }
}

การแคสต์เป็นโพรโทคอล

as? ยังใช้ตรวจสอบการทำตามข้อกำหนดของโพรโทคอลได้ โดยจะคืนค่าเมื่ออินสแตนซ์ทำตามโพรโทคอลนั้น มิฉะนั้นจะคืนค่า nil

protocol Greeter { func greet() -> String }
class Person: Greeter { func greet() -> String { return "Hi" } }
class Rock {}
let items: [Any] = [Person(), Rock()]
for item in items {
    if let g = item as? Greeter { print(g.greet()) }
}

การใช้ค่าทดแทนหลังการแคสต์

คุณสามารถใช้ as? ร่วมกับตัวดำเนินการ ?? เพื่อกำหนดค่าทดแทนเมื่อการแคสต์ล้มเหลว

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Cat(name: "Mia")
let sound = (a as? Dog)?.bark() ?? "unknown sound"
print(sound)

การเรียกแคสต์แบบต่อค่าทางเลือก

การเชื่อมต่อค่าทางเลือกช่วยให้คุณเรียกใช้เมธอดกับผลลัพธ์จากการแคสต์ได้ โดยนิพจน์ทั้งหมดจะเป็น nil หากการแคสต์ล้มเหลว

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let bark = (a as? Dog)?.bark()
print(bark as Any)

เหตุผลที่ควรเลือกการแคสต์แบบมีเงื่อนไข

as? ไม่ทำให้โปรแกรมหยุดทำงาน การแคสต์ที่ล้มเหลวจะให้ค่า nil เท่านั้น จึงเป็นค่าเริ่มต้นที่ปลอดภัยสำหรับการแคสต์ลง

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let unknown: Animal = Cat(name: "Mia")
let result = unknown as? Dog
print("Crashes? No. Value is nil:", result == nil)

ตัวอย่างสรุปการแคสต์แบบมีเงื่อนไข

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

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
func sound(of a: Animal) -> String {
    if let d = a as? Dog { return d.bark() }
    if let c = a as? Cat { return c.meow() }
    return "silence"
}
print(sound(of: Dog(name: "Rex")))
print(sound(of: Cat(name: "Mia")))

ตรวจสอบอย่างรวดเร็ว

โปรดทบทวนชนิดผลลัพธ์ของการแคสต์แบบมีเงื่อนไข

สรุป: การแคสต์แบบมีเงื่อนไขด้วย as?

คุณได้เรียนรู้ว่า as? ทำการแคสต์ลงอย่างปลอดภัยและคืนค่าทางเลือก if let และ guard let ใช้แกะกรณีที่สำเร็จ และการดำเนินการนี้ไม่ทำให้โปรแกรมหยุดทำงาน เพราะความล้มเหลวจะคืนค่า nil เท่านั้น จึงเป็นตัวดำเนินการแคสต์ลงที่ควรเลือกใช้

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let pets: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia")]
for p in pets {
    if let d = p as? Dog { print(d.bark()) } else if let c = p as? Cat { print(c.meow()) }
}

คำถามที่พบบ่อย

บทเรียน “การแปลงชนิดแบบมีเงื่อนไขด้วย as?” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแปลงชนิดแบบมีเงื่อนไขด้วย as?” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแปลงชนิดแบบมีเงื่อนไขด้วย as?”

ลองแปลงชนิดโดยให้ผลลัพธ์เป็นค่าเสริมเมื่อแปลงไม่สำเร็จ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การแปลงชนิดแบบมีเงื่อนไขด้วย as?” ใช้เวลานานแค่ไหน

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

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานการแปลงชนิดขึ้นและลง
  2. การแปลงชนิดแบบมีเงื่อนไขด้วย as?
  3. การแปลงชนิดแบบบังคับด้วย as! และความเสี่ยง
  4. การตรวจสอบชนิดด้วย is
← กลับไปที่ Swift Academy