2015-02-23 11 views
11

Voglio implementare qualcosa come "registerClassForAction". A tal fine, ho definito un protocollo:Swift: classe Instantiate (AnyClass) conforme al protocollo

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

Facciamo una dichiarazione di classe:

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

definisco la funzione per registrare l'oggetto in un'altra classe:

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

Passando al REPL, vorrei simulare il metodo di registrazione:

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

Questo momento funziona, ma c'è un altro modo per creare un'istanza di TClass, oltre che con

let tClass = aClass as NSObject.Type 

Motivo per chiedere, mi piacerebbe esplorare la possibilità di sbarazzarsi del NSObject quindi il mio TestClass non lo fa ereditare da NSObject. È stata presa in considerazione la delega, ma mi piacerebbe controllare la durata di tInst e poterla deallocarla in un momento specifico.

grazie per l'aiuto

Ron

+1

Il "definire una funzione per registrare l'oggetto in un'altra classe "è una delega. Suggerirei che l'oggetto chiamante crei una proprietà delegato TestProt e assegni a TestClass. La ginnastica di tipo casting è al massimo confusa. –

+0

Hai ragione - Sono stato "ispirato" dal metodo registerClass: forCellWithReuseIdentifier: 'di UITableViewController. Ma mi piacerebbe anche controllare il ciclo di vita della classe, poiché è necessario solo in un momento molto specifico e potrebbe quindi essere lasciato andare. Non sono sicuro se la delega sia la scelta giusta. Solo per curiosità, sto imparando l'Instantiation e la conformità del Protocollo di Swift, quindi questo sembra essere un buon esercizio. – Ron

risposta

2

Ciò è possibile in Swift 2.0 senza richiedere @objc o subclassing 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