2016-03-24 30 views
0

我有一個類爲其他類保存類類型。這些類型是在運行時註冊的,所以實際上在編譯時我不會知道類的類型。但後來我將使用這些註冊的類類型來創建它們的實例。這裏是我的班級定義在swift中創建類元類型的實例

class registeredClassTypes 
{ 
    var URLContext: AnyClass 
    var ParserContext: AnyClass 
    var ValidationContext: AnyClass 

    func setTypes(URLContext: AnyClass, ParserContext: AnyClass, ValidationContext: AnyClass) { 
     self.URLContext=URLContext 
     self.ParserContext = ParserContext 
     self.ValidationContext = ValidationContext 
    } 
} 

現在,我很抱歉收集這些類型的對象。

let classTypesObj = registeredClassTypes() 
classTypesObj.setTypes(SomeClass.self, ParserContext: AnotherClass.self, ValidationContext: OneMoreClass.self) 

有時我需要這些類型的實例。雖然可以像下面,但使用類型轉換類:

let requestType:SomeClass.Type = classTypesObj.URLContext as! SomeClass.Type 
let obj = requestType.init() //successfully creates the object of 'SomeClass' 

我剛纔提到一些博客和認識了從元類型不能沒有類型轉換創建該對象。

但我的問題是,我不會知道類'SomeClass',所以我不能將它轉換爲'SomeClass'。 有什麼辦法可以實現這個動態解析類的類型。我想是這樣的或其他任何方式:

let requestType = classTypesObj.URLContext 
let obj = requestType.init() 

簡稱this blog & this blog太多,但他們也類型轉換它。任何其他方式來解決這個問題也是可以接受的

回答

0

這個動態是目標C的標誌,在Swift中少得多。 Swift更喜歡靜態類型,所有的屬性和方法應該在編譯時知道。如果你想保持目前的方法,你可以在ObjectiveC中編寫動態部分,然後根據需要在Swift中進行擴展。

如果你想這樣做純粹斯威夫特,考慮協議:

protocol URLContextProtocol { 
    init() 
    func method1() 
    func method2() 
} 

protocol ParserContextProtocol { 
    init() 
    func method3() 
    func method4() 
} 

protocol ValidationContextProtocol { 
    init() 
    func method5() 
    func method6() 
} 

func setTypes(URLContext: URLContextProtocol, ParserContext: ParserContextProtocol, ValidationContext: ValidationContextProtocol) { 
    // ... 
} 

用法:

class URLContext1: URLContextProtocol { ... } 
class URLContext2: URLContextProtocol { ... } 

let classTypesObj = RegisteredClassTypes() 
classTypesObj.setTypes(URLContext: URLContext1, ...) 

// Init an instance 
let obj = classTypeObj.URLContext() 
+0

感謝您的答覆。如果我有許多符合每個協議的類,這個實現將如何工作。例如,我可能有4-5個類確認URLContextProtocol服務於不同的目的。並且我將如何知道要調用哪個類實例,因爲您只是將協議傳遞給setTypes方法? – ImViresh

+0

你在協議上調用'init',而不是類。協議是一個承諾,你的班級將實施某些特性和方法。它不限制如何實施這些屬性或方法。看到我編輯的答案 –