Swift 3 - class name/type 查找
Swift 3 - class name/type lookup
我的应用程序使用了绘图 class 的数百个子class。 (这些子classes是从艺术文件自动生成的。)
理想情况下,我想载入一些子class的名称,检查这些子class是否实际可用,如果是,则实例化它们。
然而,纯 Swift 中缺少 NSClassFromString
风格的功能似乎意味着我不得不提前向编译器声明我所有的 class 名称。
例如通过非常冗长乏味的 switch 语句获得 class:
func drawingObjectFromClassName(_ className: String) -> SomeDrawingProtocol?
{
switch className {
case "foo": return foo()
case "bar": return bar()
// etc.
default:
print("Warning: no class found for className: ", className)
return nil
}
}
但我还想检查是否存在子class(例如"foo"),而不必实例化对象。
我可以复制该 switch 语句来执行此操作,但那样我将有两组相同的键需要维护。呸
因此,一种可能的解决方案是使用查找 table。
问题:如果我用我所有的子class名字作为键硬编码字典,需要什么语法values ,以便可以将检索到的值实例化为所需 class?感谢您的帮助。
protocol P {
init()
}
extension String : P { }
extension Int : P { }
let types : [String : P.Type] = [
"str": String.self,
"int": Int.self
]
if let type = types["int"] {
let object = type.init()
assert(object is Int)
}
您现在可以使用所有标准字典操作来检查内容是否存在,根据需要强制转换提取的类型等。
我在上面的示例中定义了协议,以便有一个通用的初始化程序(这可能是您在大多数情况下需要的),但您可以简单地使用 Any.Type
并使用 as Int.Type
如果需要的话。
我的应用程序使用了绘图 class 的数百个子class。 (这些子classes是从艺术文件自动生成的。)
理想情况下,我想载入一些子class的名称,检查这些子class是否实际可用,如果是,则实例化它们。
然而,纯 Swift 中缺少 NSClassFromString
风格的功能似乎意味着我不得不提前向编译器声明我所有的 class 名称。
例如通过非常冗长乏味的 switch 语句获得 class:
func drawingObjectFromClassName(_ className: String) -> SomeDrawingProtocol?
{
switch className {
case "foo": return foo()
case "bar": return bar()
// etc.
default:
print("Warning: no class found for className: ", className)
return nil
}
}
但我还想检查是否存在子class(例如"foo"),而不必实例化对象。
我可以复制该 switch 语句来执行此操作,但那样我将有两组相同的键需要维护。呸
因此,一种可能的解决方案是使用查找 table。
问题:如果我用我所有的子class名字作为键硬编码字典,需要什么语法values ,以便可以将检索到的值实例化为所需 class?感谢您的帮助。
protocol P {
init()
}
extension String : P { }
extension Int : P { }
let types : [String : P.Type] = [
"str": String.self,
"int": Int.self
]
if let type = types["int"] {
let object = type.init()
assert(object is Int)
}
您现在可以使用所有标准字典操作来检查内容是否存在,根据需要强制转换提取的类型等。
我在上面的示例中定义了协议,以便有一个通用的初始化程序(这可能是您在大多数情况下需要的),但您可以简单地使用 Any.Type
并使用 as Int.Type
如果需要的话。