簡體   English   中英

快速從Class元類型創建實例

[英]Create instance from Class meta type in 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()

也引用了此博客此博客,但他們也在對此進行類型轉換。 解決該問題的任何其他方法也是可以接受的

這種活力是Objective C的標志,在Swift中則更是如此。 Swift更喜歡靜態類型,所有屬性和方法都應在編譯時知道。 如果要保留當前方法,可以在ObjectiveC中編寫動態部件,然后根據需要在Swift中進行擴展。

如果您只想在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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM