关于 as! 操作符


转自 :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”。


`as` 操作符是 C# 中用于执行引用转换的一种简便方式。它主要用于将一个对象从一种类型安全地转换为另一种兼容的类型,如果转换失败,则返回 `null` 而不是抛出异常。 下面是关于如何使用 `as` 的一些关键点: ### 使用场景 当你不确定两个引用类型是否可以相互转换,并且希望避免因为强制转型而导致程序崩溃时,就可以用到 `as` 关键字了。比如尝试把某个派生类的对象赋值给其基类变量的时候;或者是检查并处理未知类型的对象实例等场合下都十分有用。 ### 示例代码 ```csharp // 定义一个基本示例来展示 as 运算符的作用. public class Animal { } public class Dog : Animal { public void Bark() => Console.WriteLine("Woof!"); } static void Main(string[] args) { // 创建Dog实例 var dog = new Dog(); // 正确的方式 - 将dog当作Animal来看待 (不会发生实际变化). Animal animalFromDog = dog as Animal; if(animalFromDog != null){ ((Dog)animalFromDog).Bark(); } } ``` 在这个例子中我们创建了一个名为 `Dog` 类型的新实例, 然后通过 `as` 来将其视为更泛化的 `Animal` 对象而无需担心潜在的风险. 需要注意的是只有当源和目标都是**引用类型**(包括 interface、class 或 delegate),并且它们之间存在继承关系或者实现了特定接口的情况下才可以正常使用这个运算符; 如果对值类型如 int 和 string 应用了此操作将会导致编译错误.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值