首页 > 代码库 > 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的可选链,类型转换和扩展