การแปลงชนิดแบบมีเงื่อนไขด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานการแปลงชนิดขึ้นและลง
- การแปลงชนิดแบบมีเงื่อนไขด้วย as?
- การแปลงชนิดแบบบังคับด้วย as! และความเสี่ยง
- การตรวจสอบชนิดด้วย is