2015-04-18 18 views
7

Bir sınıfı değişken olarak saklamak istiyorum, böylece sınıf yöntemlerini bunun dışında daha sonra arayabilirim:Parametre olarak bir Swift sınıfını geçirin ve daha sonra bir sınıf yöntemini çağırın

ne olduğunu anlamaya çalışıyorum olduğunu

let someGenericItem = SomeGenericItem(cellClass: SomeClass.self) 

someGenericItem.doSomething("One", p2: "Two", p3: "Three") 

:

1) bir protokol böylece tanımlanmış olacağını nasıl sınıf fonk doSomething diyebiliriz

class SomeGenericItem: NSObject 
{ 
    var cellClass: AnyClass 

    init(cellClass: AnyClass) 
    { 
     self.cellClass = cellClass 
    } 

    func doSomething(p1: String, p2: String, p3: String) 
    { 
     self.cellClass.doSomething(p1, p2: p2, p3: p3) 
    } 
} 

class SomeClass: NSObject 
{ 
    class func doSomething(p1: String, p2: String, p3: String) 
    { 
     ... 
    } 
} 

bir şey gibi söylemek mümkün istiyorum ?
2) CellClass'ın beyanı ne olmalı?
3) Görüşme nasıl görünürdü?

cevap

3

Protokoller sınıf yöntemlerini tanımlayamaz, ancak statik yöntemler iyidir. Genel yazıcınız için sarıcınıza ihtiyacınız olacak ve sarılmış türün protokolünüze uygunluğunu garanti eden bir 'nerede' kısıtlaması belirtmeniz gerekir.

Örnek:

protocol FooProtocol 
{ 
    static func bar() -> Void 
} 

class FooishClass : FooProtocol 
{ 
    static func bar() -> Void 
    { 
     println("FooishClass implements FooProtocol") 
    } 
} 

class FooTypeWrapper< T where T: FooProtocol > 
{ 
    init(type: T.Type) 
    { 
     //no need to store type: it simply is T 
    } 

    func doBar() -> Void 
    { 
     T.bar() 
    } 
} 

Kullanım:

let fooishTypeWrapper = FooTypeWrapper(type: FooishClass.self) 
fooishTypeWrapper.doBar() 
+0

umarım bu işe buluyor ama garip bir sorunla ediyorum. Bunu sadece FooProtocol "fooishTypeWrapper = FooTypeWrapper (type: FooishClass.self)" ile aynı dosyada çalışıyorsa çalışabilirim. Farklı bir dosyadaysa, Swift "FooishClass: FooProtocol" sınıfının "Tip 'Aptal Sınıfı' 'protokolü' Foo Protocol 'protokolüne uymadığını söyler. Tek fark, protokolün hangi dosyada olduğudır. Bu, bu yaklaşımı bir seferde çalışmamı sağladı, ancak birden fazla dosyada kullanmayı denediğimde, derleyemem. Herhangi bir fikir? –

+0

Sadece iki kez kontrol ettim, kesinlikle iyi çalışıyor. Muhtemelen bir yerlerde yazım hatası var - sorun devam ederse kodunuzu gönderin. – Gregzo

+0

"Protokoller sınıf yöntemlerini tanımlayamıyor" Bu doğru değil. Protokoller, "statik" ile * tip yöntem gereksinimleri * bildirir. Yazma yöntemi gereksinimleri, sınıf yöntemleri veya statik yöntemler kullanılarak sınıflara göre sağlanabilir. – newacct

İlgili konular