Introducing Swift - Protocols
本文主要记录在学习Swift中【协议】时的笔记。
协议语法
// 定义
protocol SomeProtocol {
// something ...
}
// 使用
class SomeClass: SomeSuperClass, SomeProtocol {
// protocol implementation ...
}
属性要求
协议可以用于要求其遵循者必须具有某些属性,可以要求属性的读写权限,但是不会要求属性是存储型还是计算型。
通过class
关键字要求一个类必须具有的实体,通过static
关键字要求一个结构体或者枚举必须具有的实体。
方法要求
协议可以用于要求其遵循者必须实现某些实例方法和类方法。和类中定义方法不同的是,协议方法支持变长参数,不支持默认参数。
通过class
关键字要求一个类必须具有的实体,通过static
关键字要求一个结构体或者枚举必须具有的实体。
如果协议中声明的一个方法需要去改变类或者结构体或者枚举中的某一个属性,那么需要将其声明为mutating
方法。用class实现协议中的mutating方法时,不用写mutating
关键字;用结构体,枚举实现协议中的mutating方法时,必须写mutating
关键字。
委托(代理)模式
委托是一种设计模式,它允许一个对象将某些特定的操作交由其代理来实现。我们通过协议来声明这些操作,然后由代理对象去实现这些操作。和OC不同的是,我们有了更优雅的写法:
delegate?.doSomething(param)
当delegate为空时,后边的语句会优雅的忽略~
在扩展中使用协议
extension SomeClass: SomeProtocol {
// protocol implementation ...
}
如果一个类已经实现了某一个协议的方法,但是没有声明,我们也可以通过扩展来声明:
extension SomeClass: SomeProtocol {}
之所以要这样做,是因为即使类已经满足了协议所要求的属性和方法,但是类型也不会自动转变,如果不声明,这个类依旧不是一个遵循了特定协议的类。
协议的继承
协议支持多继承,类仅支持单继承。
协议一致性检验
- 使用
is
检查实例是否遵循了某个协议; - 使用
as?
返回一个可选值,如果实例遵循了协议,返回协议类型,否则返回nil; - 使用
as
用于强制向下换型。 @objc
用来表示协议是可选的(同时在相关方法和属性前面加上@optional
关键字),也可以用于表示暴露给OC的代码,此外,@objc
型协议只对类有效,因此只能在类中检查协议的一致性。