你能在Swift中为特定的泛型类型进行协议扩展吗?

时间:2016-02-10 11:54:23

标签: swift protocols

使用协议扩展,只要我提供了一个实现,我就可以使任何对象符合我自己的协议。例如。让我们假设我创建了一个协议:

protocol Printable {
    // ... whatever ...
}

现在我可以像这样打印字符串和Ints:

extension String: Printable {
    // ... whatevere required to satisify protocol ...
}

extension Int: Printable {
    // ... whatevere required to satisify protocol ...
}

这是一种非常酷的编程方式,因为我现在可以将字符串和Ints提供给我可以处理Printables的任何函数。

现在,如果我有一个Printables数组,整个数组是可打印的,所以我尝试这样做:

extension Array<Printable>: Printable {
    // ... whatevere required to satisify protocol ...
}

但是编译器并不喜欢它。

  

必须在非特定的泛型上声明约束扩展   type&#34; Array&#34;具有由&#34;其中&#34;指定的约束;子句。

对于不是问题的正常扩展。我可以这样做:

extension Array where Element: Printable {

}

这可以按预期工作。无论我在上面的扩展中添加什么,只适用于可打印元素的数组。但这不会使Printable元素数组符合Printable协议本身。这只是一个普通的扩展,而不是所谓的#34;协议扩展&#34;。

1 个答案:

答案 0 :(得分:1)

您可以在Swift 4.1中做到这一点

extension Array: Printable where Element: Printable {
    // ...
}