从 Swift 2.0 开始,我们似乎可以更接近适用于谓词情况的泛型类型的扩展。
虽然我们仍然不能这样做:
protocol Idable {
var id : String { get }
}
extension Array where T : Idable {
...
}
...我们现在可以这样做:
extension Array {
func filterWithId<T where T : Idable>(id : String) -> [T] {
...
}
}
...并且 Swift 在语法上接受它。但是,对于我来说,当我填写示例函数的内容时,我无法弄清楚如何让编译器满意。假设我要尽可能明确:
extension Array {
func filterWithId<T where T : Idable>(id : String) -> [T] {
return self.filter { (item : T) -> Bool in
return item.id == id
}
}
}
...编译器将不接受提供给过滤器的闭包,抱怨
无法使用类型为“((T)-> Bool)”的参数列表调用“过滤器”
如果 item 被指定为 Idable,则类似。有人在这里有运气吗?