Swift 中的 is as? as! as 详解
如果你是一个 Swift 新手,那么你一定比较容易混淆这几个关键词的用法,is as? as! as ,as? 和 as! 我相信用的比较多一些,但是 is 或者 as 用的人就相对少一些了。 这篇文章清楚的介绍 他们的使用场景。
一,is
我创建了一个 Any
类型的变量,意味着 anyObject 可能是任何类型,我给它赋值一个 ABC 类型的实例,然后在程序上看来,它还是一个 Any 类型的对象,我们可以使用 is
关键字去判断类型,例如下面,我就用 is
来判断,anyObject 是不是 ABC 类型,如果是打印。
class ABC {}
let anyObject: Any = ABC()
if anyObject is ABC {
print("anyObject is ABC Type")
}
// 输出 anyObject is ABC Type
二,as? 和 as!
这两个关键字的意思也比较简单,分别介绍一下。
1.as?
尝试映射目标类型,返回 Optional 可选对象,如果能映射成功,Optional 对象里面存有被映射对象的值,如果映射失败,Optional 对象里面的值为 nil。
class ABC {}
let anyObject: Any = ABC()
if let abc = anyObject as? ABC {
print("anyObject is ABC Type")
}
// 输出 anyObject is ABC Type
2.as!
这个关键字与 as? 不同的是,它会强行映射,不会返回 Optional 类型作为安全保护,意味着 如果你映射失败就直接 Crash 了。
所以,通常都是你非常确定,这么映射是没问题的,才会这样写。 如果不是,都是使用 as? 来用可选类型进行保护。
class ABC {}
let anyObject: Any = ABC()
// 这里会映射失败,直接 Crash,但是如果你使用 as?,result 会得到 Optional 对象值为 nil。但是 as!不会返回可选类型的值,直接会挂。
let result = anyObject as! Int
三,as
这个关键字,使用的频率上会少于 as? 和 as!,因为 as? 和 as! 可以用来将任何类型拿来转换,要么成功,要么失败,但是 as,从名字也能看出来 它只能转换,类型明确的对象,而且必须要遵循,子类转换成基类,反过来转也是不正确的,虽然这是一句废话。
使用 as 关键字,如果类型不能转换,在编译器就会告诉你,不会到运行时。所以放心使用!
// 基类
class ABC {}
// 子类
class DEF: ABC {
func foo() {
}
}
// 创建一个子类对象
let object = DEF()
// 使用 as 告诉 IDE 这个对象的类型是 ABC,
// 但是实际运行时打印的时候,它还是 DEF,所以就是
// as 没有改变对象的内存结构,只是编译前告诉 IDE,把它当作 ABC 类型去处理。
// 转换完成后,IDE 中认为是 ABC 类型,无法调用 foo 方法。
let result = object as ABC
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Swift Mirror 用于反射的类
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论