as,as?,as!
大约 2 分钟
as,as?,as!
下面第二行代码具有运行时错误:
8 as Double // fine
8 as! Double // crashes
as?和as!是运行时操作
as?和as!在运行时转型。程序运行时,示例中的表达式8已被分配为Int类型。因此,转换为Double失败,因为Double和Int是无关的类,Swift通常避免数字类型之间的隐式转换。 如果使用as?而不是as!,编译器将正确地检测到无用的强制转换:
8 as? Double // warning: Conditional downcast from literal to 'Double'
// always fails; consider using 'as' coercion
as?和as!是相同的操作,唯一的区别是as!强制解包其结果。这两行是等价的:
x as! Y
(x as? Y)!
as编译时执行类型强制
文字没有固有的类型:表达式4可以成为实现ExpressibleByIntegerLiteral协议的任何类型。 … as Double指示编译器使用Double符合性,就像任何其他隐式或显式类型注释一样。这两行是等价的:
let x = 4 as Double
let x: Double = 4
在模式匹配中,as运行时操作一样
在模式匹配上下文中使用时,检查在运行时执行。示例:
let value: Any = …
switch value {
case let i as Int: …
case let s as String: …
}
对比举例
as、as?、as!和is都是Swift中用于类型转换和检查的关键词。
- as
as用于在编译时将一个类型强制转换为另一个类型,如果强制转换失败,则会在编译时报错。
let x: Double = 4
let y = x as Int // 编译时报错,因为Double不能直接强制转换为Int
- as?
as?和as!都是运行时类型转换。它们用于将一个类型转换为另一个类型,并且如果转换失败,将返回nil或触发运行时错误。
let str = "Hello, World!"
let num = Int(str) as? Double // nil,因为无法将String类型转换为Double类型
let anyValue: Any = 5
let intVal = anyValue as! Int // 正确,因为Any值可以强制转换为任何类型
- as!
as?和as!在执行类型转换时的作用相同,唯一的区别是as!会强制解包结果
let optionalNum: Int? = 42
let unwrappedNum = optionalNum as! Int // 强制解包,返回42
let optionalStr: String? = nil
let unwrappedStr = optionalStr as! String // 触发运行时错误,因为无法将nil转换为String类型
- is
is关键字用于检查一个对象是否符合某个特定的类型,返回一个布尔值。
let value: Any = "Hello, World!"
if value is String {
print("value is a String") // 打印"value is a String"
}
if value is Int {
print("value is an Int") // 不会执行,因为value不是Int类型
}