Как я могу расширить тип 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 }
Кто-нибудь знает, как правильно создать типизированный метод расширения, который действует как встроенные расширения?
