Swift中的as!操作符

本文详细解释了Swift语言中as与as!操作符的区别及其使用场景。介绍了这两种操作符如何处理类型转换,并通过实例展示了Guaranteed conversion与Forced conversion的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始学习Swift,下载了他人写的项目,用xcode打开后都会提示错误。将代码中的一些as修改为as!就没问题了。在网上找了下原因,发现了这篇文章—— The as! Operator,翻译如下:

as! 操作符

在Swift 1.2以前,操作符as根据表达式的类型可以用来执行两种不同的转换:

  • Guaranteed conversion: Swift编译器保证一种类型的值转换为另外一种类型。例如,向上转换(从一种类型转换为其父类型)或者指定表达式的类型1 as Float).
  • Forced conversion: Swift编译器不保证这种强制将一种类型转换为其他类型的安全性,其可能导致运行时问题。例如,向下转换(从一种类型转换为其子类型).

Swift 1.2 从概念上将Guaranteed conversionForced conversion分成两种不同的操作符。 Guaranteed conversion仍然用as操作符,而Forced conversion则用as!操作符执行。感叹号!表明这种转换可能会失败,这样你看一眼就知道哪种代码会导致程序奔溃。

下面用例子展示其区别:

class Animal {}
class Dog: Animal {}
    
let a: Animal = Dog()
a as Dog		// now raises the error:  "'Animal is not convertible to 'Dog';
				// ... did you mean to use 'as!' to force downcast?"

a as! Dog		// forced downcast is allowed

let d = Dog()
d as Animal		// upcast succeeds

注意将表达式后缀符!?与转换符as!as?做类比:

class Animal {}

class Cat: Animal {}

class Dog: Animal {
	var name = "Spot"
}

let dog: Dog? = nil
dog?.name		// evaluates to nil
dog!.name		// triggers a runtime error

let animal: Animal = Cat()
animal as? Dog	// evaluates to nil
animal as! Dog	// triggers a runtime error

记住Swift中这些操作符模式的最简单方法是:!表示“这可能有问题”,而?表示“这可能为空”。

转载于:https://my.oschina.net/chicboi/blog/510516

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值