2015-04-18 13 views
7

Chcę móc zapisać klasę jako zmienną, więc mogę później wywołać z niej metody klasy, coś takiego:Przekaż klasę Swift jako parametr, a następnie wywołaj z niej metodę klasy.

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) 
    { 
     ... 
    } 
} 

Chcę móc powiedzieć coś takiego:

let someGenericItem = SomeGenericItem(cellClass: SomeClass.self) 

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

Co próbuję dowiedzieć się:

1) W jaki sposób protokół być zdefiniowany tak mogłem zadzwonić klasa func doSomething ?
2) Jaka powinna być deklaracja cellClass?
3) Jak wyglądałaby rozmowa?

Odpowiedz

3

Protokoły nie mogą definiować metod klasy, ale metody statyczne są w porządku. Będziesz potrzebował swojej owijki jako ogólnej i określisz ograniczenie "gdzie", które zagwarantuje zgodność z typem pakowanego z twoim protokołem.

Przykład:

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

Zastosowanie:

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

jestem znalezieniem to działa, ale z dziwnym problemem. Mogę to tylko uruchomić, jeśli FooProtocol jest w tym samym pliku co wywołanie "let fooishTypeWrapper = FooTypeWrapper (type: FooishClass.self)". Jeśli znajduje się w innym pliku, Swift skarży się na deklarację "class FooishClass: FooProtocol", która mówi, że "Type" Foolish Class "nie jest zgodna z protokołem" Foo Protocol "", mimo że tak. Jedyna różnica polega na tym, w jakim pliku znajduje się protokół. To spowodowało, że raz zastosowałem to podejście, ale jak tylko spróbuję użyć go w wielu plikach, nie mogę się skompilować. Jakieś pomysły? –

+0

Wystarczy dwukrotnie sprawdzić, działa absolutnie dobrze. Prawdopodobnie masz gdzieś literówkę - opublikuj swój kod, jeśli problem będzie się powtarzał. – Gregzo

+0

"Protokoły nie mogą definiować metod klasowych" To nie jest prawda. Protokoły deklarują * wymagania metody * z 'statycznym'. Wymagania dotyczące metod typu mogą być spełnione przez klasy przy użyciu metod klas lub metod statycznych. – newacct

Powiązane problemy