能否为 Swift 中的特定泛型类型提供协议扩展?

Mec*_*cki 3 protocols swift

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

protocol Printable {
    // ... whatever ...
}
Run Code Online (Sandbox Code Playgroud)

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

extension String: Printable {
    // ... whatever is required to satisfy protocol ...
}

extension Int: Printable {
    // ... whatever is required to satisfy protocol ...
}
Run Code Online (Sandbox Code Playgroud)

这是一种非常酷的编程方式,因为我现在可以将字符串和整数输入到任何可以处理 Printable 的函数中。

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

extension Array<Printable>: Printable {
    // ... whatever is required to satisfy protocol ...
}
Run Code Online (Sandbox Code Playgroud)

但编译器不喜欢它。

必须在非专用泛型类型“Array”上声明约束扩展,并使用“where”子句指定约束。

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

extension Array where Element: Printable {

}
Run Code Online (Sandbox Code Playgroud)

这按预期工作。我在上面的扩展中添加的内容仅适用于可打印元素的数组。但这不会使可打印元素数组符合可打印协议本身。这只是一个普通的扩展,而不是所谓的“协议扩展”。

Leo*_*sov 5

您可以在 Swift 4.1 中执行此操作

extension Array: Printable where Element: Printable {
    // ...
}
Run Code Online (Sandbox Code Playgroud)