📄
Henry
  • Henry的神秘小屋
  • 其他
    • 字节码与机器码的区别?
  • ObjectiveC
    • NSInvocation
    • 检测OC项目中未使用的方法
    • Method Selector
    • 消息转发
  • Swift
    • 检测Swift项目中未使用的类 方法 属性
    • NSCoding
    • Mirror
    • JSONEncode JSONDecode
    • Any AnyObject AnyClass
    • is as? as! as
  • Cocoapods
    • 看懂Podfile.lock文件
    • 在编写的Pod中使用宏预编译
  • iOS
    • 苹果应用 保持画面流畅
    • 关于计算机展示图像的一些问题
    • @testable
    • iOS中URLRequest的缓存策略
    • CodePush接入流程
    • H5在WKWebView中读取沙盒文件
    • FDLog App客户端日志系统
    • 如何实现JSBridge基于WKWebView
    • 网络请求各个指标的度量
    • iOS13 UIModalPresentationStyle
    • 实现H5离线包机制
    • NSURLProtocol 拦截器
    • Framework
    • Lock
    • CFNetwork NSURLSession NSURLConnection
    • setNeedsLayout layoutIfNeeded layoutSubviews
    • StackView
    • Flutter Method Channel:从Dart到Native调用链
    • JSONSerialization.ReadingOptions
    • JSONSerialization.WritingOptions
    • RunLoop高级2
    • RunLoop高级1
    • RunLoop中级
    • RunLoop初级
    • LineBreak AutoShrink
    • 如何给H5出WebView调试包
    • TODO、FIXME、!!!、???、MARK
    • Operation的使用
    • UserDefault
    • 了解WKWebView
    • 输出日志信息到系统控制台
    • Float Double 失去精度问题
    • 使用xcodebuild命令打包导出
    • 在iOS项目中使用C++定义的模块
    • 证书问题
    • 创建常驻线程
  • 源码
    • 阅读PINCache源码
    • 解读AspectHook
    • HandyJSON是如何实现的?
  • 汇编
    • 看懂汇编
由 GitBook 提供支持
在本页
  • 一,is
  • 二,as? 和 as!
  • 三,as

这有帮助吗?

  1. 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
上一页Any AnyObject AnyClass下一页Cocoapods

最后更新于5年前

这有帮助吗?