首页 > 代码库 > Swift的可选链,类型转换和扩展
Swift的可选链,类型转换和扩展
可选链(Optional Chaining)
可选链是一种请求或调用属性,方法,子脚本的过程。
可选性体现于请求或调用的目标当前可能为nil.若不为nil则成功调用,否则返回nil并将链失效。
调用可选链的返回结果与原结果类型相同,但是被包装成为了一个可选类型Optional.
这里由于roomCount返回为nil 所以执行else语句为count赋值为-1.
标注:在Beta3版本发布时对Swift稍微进行了修改,nil变成了关键字,而不再存在NilType的nil了。
可选链可以连续多层调用,假设例子:
john.residence?.address?.street?.description()
若有方法返回optional则?在括号后面。
类型转换
类型转换是一种检查实例类型的方式,也是让实例作为父类或者子类的一种方式。
在Swift中使用is或as来判断和推断他们是否为某个类或者某个协议。
is用于检查一个实例是否属于特定子类型,若果是则返回true不是则为false.注意这里是特定子类型,如果你定义了一个类并实例化它,然后检查它是否is这个类,编译器会报错告诉你这个is总是返回true.
向下转型
因为向下转型可能会失败,类型转换操作符会有两种不同的形式。
as? 返回一个optional value,即不成功返回nil。
as 则把向下转型和强制解包结合,不成功则运行时错误。
向下转换和OC,Java中的强转一样,并没有真正的改变实例,只是简单的把它告诉编译器当做这个类来使用而已。
Any和AnyObject
Swift中没有像NSObject一样的所有类基类。但有AnyObject可以表示任何class类型的实例。Any可以表示任何类型,除了方法类型。
当需要使用CocoaAPIs,一般接收一个[AnyObject]的数组,因为oc中没有明确类型的数组,其中存储的指针可以指向任何类的实例。
使用Any类型来和混合的不同类型一起工作,包括非class.
嵌套类型
Swift中是支持嵌套类型的,就像支持嵌套函数一样灵活。你可以在枚举,类和结构体中定义支持嵌套的类型。
扩展(Extension)
扩展就是类似于Objective-C中的Category,不过Swift中的扩展没有名字。
下面列举Swift中的扩展可以做的事情:
--添加计算型属性和计算静态属性
--定义实例方法或类型方法
--提供新的构造器
--定义下标脚本
--定义和使用新的嵌套类型
--使一个已有类型符合某个协议
语法
使用关键字extension
extension SomeType { ... }
适配协议:
extension SomeType: SomeProtocol, AnotherProtocol { ... }
也称为在扩展中添加协议遵循者。
添加计算型属性
注意:扩展可以添加新的计算型属性,但是不能添加存储型属性,也不可以向已有属性添加属性观测器。
当然我们可以通过设置关联引用的方式来添加一个“属性”,需要用到Swift调用CPointer的知识以及objc/runtime的关联引用,当然这也不是真正意义的属性,而只是一个关联。
构造器
扩展能向类中添加新的便利构造器,但不能添加新的指定构造器或者析构函数。
若使用扩展提供了一个新的构造器,有责任保证构造过程中让所有的实例都完全初始化。
方法
使用扩展为Int增加了一个方法,注意到这里的..<取代了当初的.. 这是在beta3时苹果对Swift语法做出的修改,主要是为了区分左闭右闭还是右开。
也可以在扩展中修改实例
下标脚本
甚至还可以在扩展中增加嵌套类型。
示例代码请点击这里
以上就是本篇博客全部内容,欢迎勘误和讨论。
Swift的可选链,类型转换和扩展
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。