2015-02-23 75 views
11

我想實現類似「registerClassForAction」的東西。 爲此,我已經定義了一個協議:Swift:符合協議的實例化類(AnyClass)

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

讓我們做一個類聲明:

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

我定義的函數註冊在另一大類對象:

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

切換到REPL,我會模擬註冊方法:

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

目前這個工作,但有另一種方式來實例化tClass,比

let tClass = aClass as NSObject.Type 

理由要求其他,我想探索擺脫NSObject的的機會,所以我的TestClass不到從NSObject繼承。代表團被考慮了,但是我想控制tInst的生命週期,並且能夠在特定的時間點解除它的分配。

感謝您幫助

羅恩

+1

「定義一個函數來註冊對象在另一類「是代表團。我建議你的調用對象創建一個TestProt委託屬性,併爲其分配TestClass。類型鑄造體操充其量混淆。 – 2015-02-23 02:38:21

+0

你是對的 - 我受到UITableViewController的'registerClass:forCellWithReuseIdentifier:'方法的啓發。但我也想控制班級的生命週期,因爲它只在特定的時間需要,然後可以放開。不知道委派是否是正確的選擇。出於好奇,我正在學習Swift的實例化和協議一致性,所以這似乎是一個很好的練習。 – Ron 2015-02-23 02:43:32

回答

2

這是可能在夫特2.0無需@objc或子類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