Как я могу расширить тип Swift Array<T>
или T[]
с помощью пользовательских функциональных utils?
Просмотр документов Swift API показывает, что методы Array являются расширением T[]
, например:
extension T[] : ArrayType {
//...
init()
var count: Int { get }
var capacity: Int { get }
var isEmpty: Bool { get }
func copy() -> T[]
}
При копировании и вставке одного и того же источника и выполнении любых изменений, например:
extension T[] : ArrayType {
func foo(){}
}
extension T[] {
func foo(){}
}
Не удается построить с ошибкой:
Номинальный тип
T[]
не может быть расширен
Использование полного определения типа не выполняется с помощью Use of undefined type 'T'
, i.e:
extension Array<T> {
func foo(){}
}
И он также терпит неудачу с Array<T : Any>
и Array<String>
.
Любопытно. Swift позволяет мне расширять нетипизированный массив с помощью:
extension Array {
func each(fn: (Any) -> ()) {
for i in self {
fn(i)
}
}
}
Что он позволяет мне звонить с помощью:
[1,2,3].each(println)
Но я не могу создать правильное расширение общего типа, поскольку тип кажется потерянным, когда он протекает через метод, например, пытается заменить встроенный фильтр Swift с помощью:
extension Array {
func find<T>(fn: (T) -> Bool) -> T[] {
var to = T[]()
for x in self {
let t = x as T
if fn(t) {
to += t
}
}
return to
}
}
Но компилятор рассматривает его как нетипизированный, где он по-прежнему позволяет вызывать расширение с помощью:
["A","B","C"].find { $0 > "A" }
И когда stepper-thru с отладчиком указывает, что тип Swift.String
, но он создает ошибку сборки, чтобы попытаться получить доступ к ней, как String, не отбрасывая ее на String
сначала, i.e:
["A","B","C"].find { ($0 as String).compare("A") > 0 }
Кто-нибудь знает, как правильно создать типизированный метод расширения, который действует как встроенные расширения?