我想扩展Array以增加对新协议的一致性-但仅适用于其元素本身符合特定协议的数组。
更笼统地说,我想让带有类型参数的类型(无论是协议类型还是具体类型)仅在类型参数与某些约束匹配时才实现协议。
从Swift 2.0开始,这似乎是不可能的。有什么我想念的方式吗?
例
假设我们有以下Friendly协议:
protocol Friendly {
func sayHi()
}
我们可以扩展现有的类型来实现它:
extension String: Friendly {
func sayHi() {
print("Greetings from \(self)!")
}
}
"Sally".sayHi()
我们还可以扩展Array实现sayHi()所有元素Friendly:
extension Array where Element: Friendly {
func sayHi() {
for elem in self {
elem.sayHi()
}
}
}
["Sally", "Fred"].sayHi()
此时,类型[Friendly]本身应该实现Friendly,因为它满足协议的要求。但是,此代码无法编译:
extension Array: Friendly where Element: Friendly {
func sayHi() {
for elem in self {
elem.sayHi()
}
}
}
错误消息是“具有约束的'Array'类型的扩展不能具有继承子句”,这似乎最终确定了直接方法的大门。
有间接解决方法吗?我可以使用一些巧妙的技巧?也许有一种方法涉及扩展SequenceType而不是Array?
一个有效的解决方案将使此代码编译:
let friendly: Friendly = ["Foo", "Bar"]
更新:它已落入Swift 4.1中,真是太美了!
extension Array: Friendly where Element: Friendly现在,该示例将按照原始问题中的说明进行编译。
白猪掌柜的