2015-04-18 10 views
7

voglio essere in grado di memorizzare una classe come variabile, in modo da poter chiamare i metodi della classe fuori di esso più tardi, qualcosa di simile:passare una classe Swift come parametro, e quindi chiamare un metodo di una classe fuori di esso

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

voglio essere in grado di dire qualcosa del tipo:

let someGenericItem = SomeGenericItem(cellClass: SomeClass.self) 

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

Quello che sto cercando di capire è:

1) Come sarebbe un protocollo definito così ho potuto chiamare classe func doSomething ?
2) Quale dovrebbe essere la dichiarazione di cellClass?
3) Come apparirebbe la chiamata?

risposta

3

I protocolli non possono definire i metodi di classe, ma i metodi statici vanno bene. Avrete bisogno del vostro wrapper per essere generico e specificare un vincolo 'where' che garantisca la conformità del tipo avvolto al vostro protocollo.

Esempio:

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

Usa:

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

Sto trovando questo funziona, ma con un problema strano. Posso farlo funzionare solo se FooProtocol si trova nello stesso file della chiamata a "let fooishTypeWrapper = FooTypeWrapper (type: FooishClass.self)". Se si trova in un file diverso, Swift si lamenta della dichiarazione di "classe FooishClass: FooProtocol" che dice "Tipo" Foolish Class "non conforme al protocollo" Foo Protocol "", anche se lo fa. L'unica differenza è il file in cui è presente il protocollo. Ciò mi ha indotto a far funzionare questo approccio una volta, ma non appena riesco a utilizzarlo in più file non riesco a compilare. Qualche idea? –

+0

Appena ricontrollato, funziona perfettamente. Probabilmente hai un errore di battitura da qualche parte - inserisci il tuo codice se il problema persiste. – Gregzo

+0

"I protocolli non possono definire i metodi di classe" Questo non è vero. I protocolli dichiarano * requisiti del metodo di tipo * con 'static'. I requisiti del tipo di metodo possono essere soddisfatti dalle classi utilizzando metodi di classe o metodi statici. – newacct