0Pricing
Swift Academy · 课时

类型转换:is、as?、as! 与 as

使用 Swift 的类型转换运算符安全地检查和转换类型。

类型转换:is、as?、as! 与 as 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

什么是类型转换

类型转换允许您检查实例,或将实例转换为其层次结构中的其他类。

class Animal { var name: String = "Animal" }
class Dog: Animal { func bark() { print("Woof") } }
let a: Animal = Dog()
print(a.name)

类型检查运算符

使用 is 检查实例是否属于某个特定子类。

let a: Animal = Dog()
if a is Dog {
  print("It's a dog")
}

使用 as? 向下转换

as? 会尝试向下转换,并返回一个可选值。如果转换失败,结果就是 nil。

let a: Animal = Dog()
if let dog = a as? Dog {
  dog.bark()
} else {
  print("Not a dog")
}

使用 as! 向下转换

as! 会强制转换为子类型。只有在确定类型正确时才能使用;类型错误会导致崩溃。

let a: Animal = Dog()
let dog = a as! Dog
dog.bark()

使用 as 向上转换

从子类向上转换为超类总是会成功,并使用 as。

let dog = Dog()
let animal = dog as Animal
print(animal.name)

集合中的类型转换

类型为 [Any] 的混合类型数组需要进行类型转换,才能使用特定行为。

let items: [Any] = [1, "hello", Dog()]
for item in items {
  if let d = item as? Dog { d.bark() }
  if let s = item as? String { print(s) }
}

使用 AnyObject 进行类型转换

AnyObject 表示任意类实例。使用 as? 提取具体类型。

let objs: [AnyObject] = [Dog(), Dog()]
for obj in objs {
  if let d = obj as? Dog { d.bark() }
}

协议类型转换

您可以使用相同的运算符,在协议类型与具体类型之间进行转换。

protocol Runnable { func run() }
class Cat: Animal, Runnable { func run() { print("Cat runs") } }
let r: Runnable = Cat()
if let cat = r as? Cat { print(cat.name) }

在 switch 中使用类型模式匹配

Swift 的 switch 语句可以使用 is 模式匹配类型。

let value: Any = 42
switch value {
case is Int: print("Integer")
case is String: print("String")
default: print("Other")
}

switch 模式中的 as?

将 switch 与 let x as Type 结合,即可在一步中同时检查类型并绑定值。

let value: Any = "Swift"
switch value {
case let s as String: print("String: \(s)")
case let i as Int: print("Int: \(i)")
default: break
}

安全类型转换最佳实践

始终优先使用 as? 而不是 as!,以避免生产代码在运行时崩溃。

func describe(_ obj: AnyObject) {
  if let dog = obj as? Dog { dog.bark(); return }
  print("Unknown type")
}

快速检查

向下转换时,哪个运算符会返回可选值?

课程回顾

Swift 类型转换:is 检查类型,as? 安全地向下转换为可选值,as! 强制向下转换,as 向上转换。在生产代码中优先使用 as?。

常见问题解答

「类型转换:is、as?、as! 与 as」课时是免费的吗?

是的 — 「类型转换:is、as?、as! 与 as」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「类型转换:is、as?、as! 与 as」这节课中我会学到什么?

使用 Swift 的类型转换运算符安全地检查和转换类型。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「类型转换:is、as?、as! 与 as」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 类继承与 super 关键字
  2. override、final 与禁止子类化
  3. 类型转换:is、as?、as! 与 as
  4. 反初始化器与内存生命周期
← 返回 Swift Academy