1.用类型检查操做符(is
)来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操做符返回 true
,不然返回 false
。javascript
2.某类型的一个常量或变量可能在幕后实际上属于一个子类。当肯定是这种状况时,你能够尝试向下转到它的子类型,用类型转换操做符(as?
或 as!
)。java
由于向下转型可能会失败,类型转型操做符带有两种不一样形式。条件形式(conditional form)as?
返回一个你试图向下转成的类型的可选值(optional value)。强制形式 as!
把试图向下转型和强制解包(force-unwraps)转换结果结合为一个操做。nginx
当你不肯定向下转型能够成功时,用类型转换的条件形式(as?
)。条件形式的类型转换老是返回一个可选值(optional value),而且若下转是不可能的,可选值将是 nil
。这使你可以检查向下转型是否成功。swift
3.Swift 为不肯定类型提供了两种特殊的类型别名:数组
AnyObject
能够表示任何类类型的实例。Any
能够表示任何类型,包括函数类型。4.Swift 中的扩展能够:函数
能够经过扩展来扩展一个已有类型,使其采纳一个或多个协议。在这种状况下,不管是类仍是结构体,协议名字的书写方式彻底同样:spa
extension SomeType: SomeProtocol, AnotherProctocol {
// 协议实现写到这里 }
注意:扩展能够添加新的计算型属性,可是不能够添加存储型属性,也不能够为已有属性添加属性观察器。code
扩展能够为一个类型添加新的功能,可是不能重写已有的功能。orm
若是你经过扩展为一个已有类型添加新功能,那么新功能对该类型的全部已有实例都是可用的,即便它们是在这个扩展定义以前建立的。ip
5.协议能够要求采纳协议的类型提供特定名称和类型的实例属性或类型属性。协议不指定属性是存储型属性仍是计算型属性,它只指定属性的名称和类型。此外,协议还指定属性是只读的仍是可读可写的。
协议一般用 var
关键字来声明变量属性,在类型声明后加上 { set get }
来表示属性是可读可写的,只读属性则用 { get }
来表示:
protocol SomeProtocol {
var mustBeSettable: Int { get set } var doesNotNeedToBeSettable: Int { get } }
在协议中定义类型属性时,老是使用 static
关键字做为前缀。当类类型采纳协议时,除了 static
关键字,还可使用 class
关键字来声明类型属性:
protocol AnotherProtocol {
static var someTypeProperty: Int { get set } }
6.协议能够要求采纳协议的类型实现某些指定的实例方法或类方法。这些方法做为协议的一部分,像普通方法同样放在协议的定义中,可是不须要大括号和方法体。能够在协议中定义具备可变参数的方法,和普通方法的定义方式相同。可是,不支持为协议中的方法的参数提供默认值。
protocol SomeProtocol { static func someTypeMethod() }
7.尽管协议自己并未实现任何功能,可是协议能够被当作一个成熟的类型来使用。
协议能够像其余普通类型同样使用,使用场景以下: