Что касается 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)»
Аналогично, если элемент указан как Idable. Кому-нибудь здесь повезло?