使用协议扩展,只要我为此提供实现,我就可以使任何对象符合我自己的协议 . 例如 . 我假设我创建了一个协议:
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 ...
}
但编译器不喜欢它 .
必须在当前未特定的泛型类型“Array”上声明约束扩展,其中约束由“where”子句指定 .
对于不是问题的正常扩展 . 我可以这样做:
extension Array where Element: Printable {
}
这按预期工作 . 无论我在上面的扩展中添加什么,只适用于可打印元素的数组 . 但这不会使Printable元素数组符合Printable协议本身 . 这只是一个普通的扩展,而不是所谓的“协议扩展” .
1 回答
你可以在Swift 4.1中做到这一点