[Swift 3]协议

部分内容笔记。

协议类型

协议作为类型,可以考虑集合宣告的一部分,也可以作为变数宣告的一部分,表示该变数本身是什么类别,但必定遵守此协议,另外也可以用down的语法来处理它。

可选协议要求

您可以为协议定义可选要求。遵循此协议的类型不用一定要实作这些可选要求。可选要求的定义方法是在协议的宣告前面加上可选的修饰修饰词。

使用上,当你的协议里面的成员为可选要求时,该成员前面要加上@objc,并且该协议的宣告前面也要加上@objc。

  @objc协议SomeProtocol { 
@objc可选的func someMethod()
}

需要注意的是,这代表这些属性和方法的类型都是可选的。因为你可以不实作,那表示这值可能就是零,方法也有类型,由参数和回传值组成,例如(Int)-> String,这时就会变成((Int)-> String)?

  @objc协议SomeProtocol { 
@objc可选varstoreProperty:整型{get}
@objc可选func someFunction()->字符串
}

加上optional表示有没有实作都可以,所以使用上要配合可选链,如果是可选功能,要在呼叫时,于括号前加上问号。

 如果让文字=采用ClassInstance.someFunction?(){ 
打印(文字)
}

加上@objc表示要和objective-C协作,协议前面也需要注记@objc 。这样的协议只能由继承自objective-C或其他@objc的类别遵守。无法由结构或枚举来遵守。

  @objc类SomeClass:SomeProtocol { 
  } 

协议扩展

通过由扩展,让您可以定义协议的行为,而不必在每一个遵守该协议的类型或者在全局函数里面去实作这些行为。

这里稍微和你直觉想像的协议的扩展不同,协议的扩展是可以提供具体的实作的,你可以想像这个扩展是将所有采用某个扩展协议的类都外加一些属性或者方法。可以说是对全部符合此扩展协议的类的扩展。

 扩展SomeProtocol { 
有趣的description(){
打印(someFunction())
}
}

到这边你可以想像说,那扩展可不可以让protocol的要求的属性或者方法有时序的实作呢?当然可以,在符合类型提供自己的实作之后,这样的实作就会被替代掉,反之,conform type没有提供需要的实作的话,就会采用时间表的实作。

向协议扩展添加约束

你可能不希望扩展协议可以适用于所有的符合类型,你可以加上一些限制,踩到让那些符合类型获得扩展协议。在内部定义的实作之前,进行检查。你会使用where这个通用子句(参考这里)。