加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于 as! 操作符

发布时间:2020-12-14 01:45:59 所属栏目:百科 来源:网络整理
导读:转自 :http://www.theswiftworld.com/2015/03/06/the-as-operator/ 在 Swift 1.2 之前, as 操作符可以进行两种类型的转换,这取决于被转换的表达式和转换到的类型。 有保证的转换 从一个类型到另一个类型的转换是否成功可以用过 Swift 的编译器来验证,例


转自 :http://www.theswiftworld.com/2015/03/06/the-as-operator/

在 Swift 1.2 之前,as 操作符可以进行两种类型的转换,这取决于被转换的表达式和转换到的类型。

  • 有保证的转换 从一个类型到另一个类型的转换是否成功可以用过 Swift 的编译器来验证,例如,向上转型(从一个类转换到它的父类)或指定字面表达式的类型(比如,1 as Float)。

  • 强制转换 Swift 编译器不保证从一个类型强制转换到另一个类型的安全性,这有可能会引起运行时陷阱。例如,向下转型,从一个类型转换到它的子类。

Swift 1.2 将有保证的转换和强制转换的表达方式分成了两个独立的操作符。有保证的转换仍然使用 as 操作符,但强制转换现在使用 as! 操作符。! 代表这个转换可能会失败。这样,你就比较容易找出哪些转换会导致程序崩溃。

下面的例子描述了这个改变:

class Animal {}
class Dog: Animal {}

let a: Animal = Dog()
a as Dog		// 现在会报这样的错误:  "'Animal is not convertible to 'Dog';
				// did you mean to use 'as!' to force downcast?"

a as! Dog		// 强制的向下转型是允许的

let d = Dog()
d as Animal		// 向上转型成功

注意关于 !? 后缀的对比,还有转换操作符 as!as? 的对比:
class Animal {}

class Cat: Animal {}

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

let dog: Dog? = nil
dog?.name		// 返回 nil
dog!.name		// 触发运行时错误

let animal: Animal = Cat()
animal as? Dog	// 返回 nil
animal as! Dog	// 触发运行时错误

从这些操作符可以很容易的记住这个模式: ! 代表 “可能会崩溃”,? 代表 “可能会返回 nil”。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读