如何根据Swift API设计指南调整协议/实现对?

时间:2016-04-28 14:18:35

标签: swift naming-conventions api-design

在新的Swift API design guidelines中,协议的常用Type后缀正在被删除。虽然这对于独立的协议(SequenceType变为Sequence)很容易做,但我不确定如何更新协议为实现提供基础的API。以下是流行框架的一些示例:

  • Resultμframework提供Result,具体的成功/失败枚举,以及ResultTypeResult,成功/失败类型的通用基础协议,Signal符合
  • ReactiveCocoa的主要类型为SignalProducerSignalType,由SignalProducerTypeAnySequence支持。

在这两种情况下,大部分实现都是对协议的扩展,允许扩展使用类型约束的全部功能,并允许实现是通用的。这与具有<script src="https://code.highcharts.com/4.0.1/highcharts.js"></script> <script src="https://code.highcharts.com/maps/1.0.1/modules/map.js"></script> <script src="https://code.highcharts.com/4.0.1/modules/data.js"></script> 样式类型擦除类型的协议的情况不同:您不是真的希望自己实现这些协议,或统一不同的类型。

1 个答案:

答案 0 :(得分:17)

我建议使用后缀Protocol。这与标准库如何从协议中删除Type后缀一致,如SE-0006中所述:

  

在高级别上,更改可归纳如下。

     
      
  • 从协议名称中删除Type后缀。在这几个特例中   意味着添加Protocol后缀以避开类型名称   这是主要的(虽然大多数这些都是我们希望被淘汰的   Swift 3语言功能)。
  •   

例如,GeneratorType已重命名为IteratorProtocol

而且,例如,Result和&amp; ReactiveSwift已更新其Swift 3的API。ResultType已重命名为ResultProtocolthis commit中),SignalType已重命名为SignalProtocol,并且SignalProducerType已重命名为SignalProducerProtocol(在this commit中)。

虽然值得注意的是,在绝大多数情况下,此类协议仅作为缺少parameterised extensions的解决方法而存在。

例如,我们目前无法说:

struct SomeGenericThing<T> {
    var value: T
}

extension <T> Array where Element == SomeGenericThing<T>, T : Comparable {

}

但引入协议允许我们将通用占位符实现为关联类型,然后我们可以在约束中使用它们:

protocol SomeGenericThingProtocol {
    associatedtype T
    var value: T { get set }
}

struct SomeGenericThing<T> : SomeGenericThingProtocol {
    var value: T
}

extension Array where Element : SomeGenericThingProtocol, Element.T : Comparable {
    // ...
}

因此,一旦支持参数化扩展,我们就可以取消此类协议。