2015-04-18 8 views
7

Ich möchte eine Klasse als Variable speichern zu können, so kann ich später aus ihm heraus Klassenmethoden nennen, etwa wie folgt:Pass eine Swift-Klasse als Parameter, und dann eine Klassenmethode es aus anrufen

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

ich möchte in der Lage sein, etwas zu sagen wie:

let someGenericItem = SomeGenericItem(cellClass: SomeClass.self) 

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

Was ich versuche, herauszufinden:

1) Wie würde ein Protokoll definiert werden, so dass ich Klasse func doSomething nennen ?
2) Was müsste die Deklaration von cellClass sein?
3) Wie würde der Anruf aussehen?

Antwort

3

Protokolle können Klassenmethoden nicht definieren, aber statische Methoden sind in Ordnung. Sie müssen Ihren Wrapper als generisch definieren und eine Where-Einschränkung angeben, die die Konformität des Wrapped-Typs mit Ihrem Protokoll garantiert.

Beispiel:

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

Verwendung:

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

Ich finde das funktioniert, aber mit einem seltsamen Problem. Ich kann das nur funktionieren, wenn das FooProtocol in der gleichen Datei ist wie der Aufruf von "let fooishTypeWrapper = FooTypeWrapper (type: FooishClass.self)". Wenn es in einer anderen Datei ist, beschwert sich Swift über die Deklaration von "Klasse FooishClass: FooProtocol" und sagt: "Type 'Foolish Class' entspricht nicht dem Protokoll 'Foo Protocol'", obwohl es dies tut. Der einzige Unterschied ist, in welcher Datei das Protokoll ist. Dies hat mich dazu gebracht, diesen Ansatz einmal zu funktionieren, aber sobald ich versuche, es in mehreren Dateien zu verwenden, kann ich nicht kompilieren. Irgendwelche Ideen? –

+0

Nur doppelt überprüft, funktioniert absolut gut. Wahrscheinlich hast du irgendwo einen Tippfehler - poste deinen Code, wenn das Problem weiterhin besteht. – Gregzo

+0

"Protokolle können Klassenmethoden nicht definieren" Das ist nicht wahr. Protokolle deklarieren * Typ Methodenanforderungen * mit 'static'. Typemethodanforderungen können durch Klassen erfüllt werden, die entweder Klassenmethoden oder statische Methoden verwenden. – newacct

Verwandte Themen