Swift5.1—扩展协议和默认实现

Swift5.1—扩展协议和默认实现,第1张

协议可以通过扩展来为遵循协议的类型提供属性、方法以及下标的实现。通过这种方式,你可以基于协议本身来实现这些功能,而无需在每个遵循协议的类型中都重复同样的实现,也无需使用全局函数。

例如,可以扩展 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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11871482.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存