JHZ*_*JHZ 21 api-design naming-conventions swift
在新的Swift API设计指南中,Type正在使用常用的协议后缀.虽然这对于独立(SequenceType成为Sequence)协议很容易做,但我不确定如何更新我的API,其中协议为实现提供了基础.以下是流行框架的一些示例:
Result,混凝土成功/失败枚举,并且ResultType,通用基础协议用于成功/失败类型,向其中Result符合.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)
因此,一旦支持参数化扩展,我们就能够废除这些协议.