在新的Swift API design guidelines中,协议的常用Type
后缀正在被删除。虽然这对于独立的协议(SequenceType
变为Sequence
)很容易做,但我不确定如何更新协议为实现提供基础的API。以下是流行框架的一些示例:
Result
,具体的成功/失败枚举,以及ResultType
,Result
,成功/失败类型的通用基础协议,Signal
符合SignalProducer
和SignalType
,由SignalProducerType
和AnySequence
支持。在这两种情况下,大部分实现都是对协议的扩展,允许扩展使用类型约束的全部功能,并允许实现是通用的。这与具有<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>
样式类型擦除类型的协议的情况不同:您不是真的希望自己实现这些协议,或统一不同的类型。
答案 0 :(得分:17)
我建议使用后缀Protocol
。这与标准库如何从协议中删除Type
后缀一致,如SE-0006中所述:
在高级别上,更改可归纳如下。
- 从协议名称中删除
Type
后缀。在这几个特例中 意味着添加Protocol
后缀以避开类型名称 这是主要的(虽然大多数这些都是我们希望被淘汰的 Swift 3语言功能)。
例如,GeneratorType
已重命名为IteratorProtocol
。
而且,例如,Result和&amp; ReactiveSwift已更新其Swift 3的API。ResultType
已重命名为ResultProtocol
(this 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 {
// ...
}
因此,一旦支持参数化扩展,我们就可以取消此类协议。