2015-02-23 6 views
11

Ich möchte etwas wie "RegisterClassForAction" implementieren. Zu diesem Zweck habe ich ein Protokoll definiert:Swift: Instantiate-Klasse (AnyClass) gemäß Protokoll

@objc protocol TestProt { 
    func testMe() -> String 
} 

Lassen Sie sich eine Klassendeklaration tun:

class TestClass: NSObject, TestProt { 
    func testMe() -> String { 
     return "test" 
    } 
} 

Ich definiere die Funktion, das Objekt in einer anderen Klasse registrieren:

func registerClassForAction(aClass: AnyClass) { ... } 

Auf die REPL umstellen, würde ich die Registermethode simulieren:

let aClass: AnyClass = TestClass.classForCoder() //or .self 
let tClass = aClass as NSObject.Type 
let tInst = tClass() as TestProt 
tInst.testMe() 

Dies funktioniert derzeit aber gibt es eine andere Art und Weise TClass, anders als bei

let tClass = aClass as NSObject.Type 

Grund instanziiert zu fragen, würde Ich mag die Chance erkunden der NSObject loszuwerden so mein Testclass nicht auf erben von NSObject. Die Delegierung wurde in Betracht gezogen, aber ich möchte die Lebensdauer von tInst kontrollieren und die Zuordnung zu einem bestimmten Zeitpunkt rückgängig machen können.

Dank für

Ron helfen

+1

Die „eine Funktion definieren, um das Objekt zu registrieren in eine andere Klasse "ist Delegation. Ich würde vorschlagen, dass Ihr aufrufendes Objekt eine TestProt-Delegateigenschaft erstellt und Sie TestClass zuweisen. Die Typengymnastik ist bestenfalls verwirrend. –

+0

Sie haben Recht - ich wurde von der 'registerClass: forCellWithRuseIdentifier:' Methode des UITableViewControllers "inspiriert". Aber ich möchte auch den Lebenszyklus der Klasse kontrollieren, da sie nur zu einem bestimmten Zeitpunkt benötigt wird und dann losgelassen werden könnte. Nicht sicher, ob Delegation die richtige Wahl ist. Aus reiner Neugierde lerne ich etwas über Instantiierung und Protokollkonformität von Swift, also scheint das eine gute Übung zu sein. – Ron

Antwort

2

Dies ist möglich, in Swift 2.0, ohne @objc oder Subklassifizieren NSObject:

protocol TestProt { 
    func testMe() -> String 
} 

class TestClass: TestProt { 

    // This init is required in order 
    // to construct an instance with 
    // a metatype value (class.init()) 
    required init() { 
    } 

    func testMe() -> String { 
     return "Hello from TestClass" 
    } 
} 

let theClass = TestClass.self 
let tInst: TestProt = theClass.init() 

tInst.testMe() 

enter image description here