as,as?,as!

木木木大约 2 分钟iOSSwift语法区分

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类型
}
上次编辑于:
贡献者: perhapsdone