例如,可以扩展 RandomNumberGenerator 协议来提供 randomBool() 方法。该方法使用协议中定义的 random() 方法来返回一个随机的 Bool 值:
通过协议扩展,所有遵循协议的类型,都能自动获得这个扩展所增加的方法实现而无需任何额外修改:
协议扩展可以为遵循协议的类型增加实现,但不能声明该协议继承自另一个协议。协议的继承只能在协议声明处进行指定。
可以通过协议扩展来为协议要求的方法、计算属性提供默认的实现。如果遵循协议的类型为这些要求提供了自己的实现,那么这些自定义实现将会替代扩展中的默认实现被使用。
例如, PrettyTextRepresentable 协议继承自 TextRepresentable 协议,可以为其提供一个默认的 prettyTextualDescription 属性来简单地返回 textualDescription 属性的值:
注:
1.协议,可以继承协议,也可以扩展系统自带协议。
2.默认实现:协议只是制定标准接口,不能写具体实现,但可在扩展中写属性和方法的实现。
Swift 4.0版本引入了一种新的对象序列化的方式 Codeable ,用于代替原先OC语法的 NSCode 协议。在程序执行过程中,我们经常需要通过网络发送数据,保存数据到磁盘,这往往是一个对象序列化的过程;在Swift4.0开始,系统提供一套对象编解码的协议,可以自动或者自定义的实现对象的序列化。
想要对象可编码,最简单的方式就是用可编码的类型去声明属性;
这些可编码的属性包括: Int String Double Date Data URL 等
接下来,我们只需要让对象实现 Codeable 协议,该对象就自动实现了编码和解码。
但是我们平常开发中,属性往往也是自定义对象,在 Codeable 协议中,只需要所有的属性都支持编解码,那么该对象也能编解码。
内置的类型,比如 Array Dictionary ,只需要元素实现了 Codeable ,那么也支持编解码。
如果你对象和编码结构不同,你可以自定义编码和解码协议的实现,完成对象的编码和解码。
解码实现 init(from decoder: Decoder)
编码实现 encode(to encoder: Encoder)
Swift提供了系统的JSON数据的编解码方式,可以将实现 Codeable 对象和JSON对象相互转化,非常的简单和方便。
我自己写的一个KV存储库 SwiftLvDB ,也将支持 Codeable 对象存储,敬请关注。
https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types
https://developer.apple.com/documentation/foundation/jsonencoder
https://developer.apple.com/documentation/foundation/jsondecoder
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)