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

JHZ*_*JHZ 21 api-design naming-conventions swift

在新的Swift API设计指南中,Type正在使用常用的协议后缀.虽然这对于独立(SequenceType成为Sequence)协议很容易做,但我不确定如何更新我的API,其中协议为实现提供了基础.以下是流行框架的一些示例:

  • 该结果 μframework提供Result,混凝土成功/失败枚举,并且ResultType,通用基础协议用于成功/失败类型,向其中Result符合.
  • ReactiveCocoa的主要类型是Signal和SignalProducer,由SignalType和支持SignalProducerType.

在这两种情况下,大部分实现都是对协议的扩展,允许扩展使用类型约束的全部功能,并允许实现是通用的.这是从协议的情况下,不同AnySequence风格类型擦除类型:你是不是真的有望实现你自己的这些协议,或统一不同的类型.

Ham*_*ish 17

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

在高层次上,变化可归纳如下.

  • Type从协议名称中删除后缀.在一些特殊情况下,这意味着添加一个Protocol后缀以避开主要类型名称的方式(尽管大多数这些都希望被Swift 3语言功能淘汰).

例如,GeneratorType被重命名为IteratorProtocol.

并且,例如,还兼有如何结果与ReactiveSwift已经更新了他们的API斯威夫特3. ResultType更名为ResultProtocol(在此提交),并SignalType更名为SignalProtocol,并SignalProducerType更名为SignalProducerProtocol(在此提交).

虽然值得注意的是,在绝大多数情况下,此类协议仅作为缺乏参数化扩展的解决方法而存在.

例如,我们目前无法说:

struct SomeGenericThing<T> {
    var value: T
}

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

extension Array where Element : SomeGenericThingProtocol, Element.T : Comparable {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

因此,一旦支持参数化扩展,我们就能够废除这些协议.