SORU
4 HAZİRAN 2014, ÇARŞAMBA


Ne kadar Hızlı yazdığınız Diziler uzatabilir miyim?

Nasıl özel işlevsel araçları ile Swift Array<T> T[] yazın uzatabilir miyim?

Swift API docs bakınıyorum Dizi yöntemleri ** 12, e bir uzantısı olduğunu gösteriyor.g:

extension T[] : ArrayType {
    //...
    init()

    var count: Int { get }

    var capacity: Int { get }

    var isEmpty: Bool { get }

    func copy() -> T[]
}

Ve aynı kaynaktan yapıştırarak ve değişimler gibi çalışıyor:

extension T[] : ArrayType {
    func foo(){}
}

extension T[] {
    func foo(){}
}

Hata oluşturma başarısız:

T[] Nominal türü uzatılabilir

Tam tip tanımı kullanarak Use of undefined type 'T', ben başarısız.e:

extension Array<T> {
    func foo(){}
}

Ve aynı zamanda Array<T : Any> Array<String> ile başarısız olur.

Merakla Swift benimle yazılmamış bir dizi genişletmek sağlar:

extension Array {
    func each(fn: (Any) -> ()) {
        for i in self {
            fn(i)
        }
    }
}

Bana diyebilir ki:

[1,2,3].each(println)

Ama bu tür bir yöntem, e akar zaman kaybetmiş gibi düzgün bir genel tür uzantısı oluşturmak mümkün değil.30 g* *için çalışıyoruz:

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
    }
}

Ama derleyici bunu hala uzantısı arama sağlar nerede: yazılmamış gibi davranır

["A","B","C"].find { $0 > "A" }

Ve-thru basamaklı bir hata ayıklayıcı ile ne tür Swift.String ama kurmak bir hata String ilk olarak, benim için çevrim olmadan bir Dize gibi erişim denemek için olduğunu gösterir.e:

["A","B","C"].find { ($0 as String).compare("A") > 0 }

Herkes doğru yolu yerleşik uzantıları gibi davranan yazılan uzantısı bir yöntem oluşturmak için ne olduğunu biliyor mu?

CEVAP
4 HAZİRAN 2014, ÇARŞAMBA


Farklı şeyler denemek bir süre sonra çözüme imza gibi <T> kaldırmak gibi görünüyor:

extension Array {
    func find(fn: (T) -> Bool) -> [T] {
        var to = [T]()
        for x in self {
            let t = x as T;
            if fn(t) {
                to  = t
            }
        }
        return to
    }
}

Şimdi olarak tasarlanmıştır hatasız çalışır:

["A","B","C"].find { $0.compare("A") > 0 }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BetterCoder

    BetterCoder

    17 Aralık 2012
  • Blunty

    Blunty

    13 Mart 2006
  • Cole Rolland

    Cole Rolland

    23 Kasım 2008