![](/img/trans.png)
[英]Swift how to create class instance from string originating in lib
[英]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.