如何根据Swift中字典中的查找值动态实例化一个类型?
答案 0 :(得分:4)
希望这对其他人有用。这需要一些研究来解决这个问题。目标是避免使用Giant if或switch语句的反模式从值创建每个对象类型。
class NamedItem : CustomStringConvertible {
let name : String
required init() {
self.name = "Base"
}
init(name : String) {
self.name = name
}
var description : String { // implement Printable
return name
}
}
class File : NamedItem {
required init() {
super.init(name: "File")
}
}
class Folder : NamedItem {
required init() {
super.init(name: "Folder")
}
}
// using self to instantiate.
let y = Folder.self
"\(y.init())"
let z = File.self
"\(z.init())"
// now put it in a dictionary.
enum NamedItemType {
case folder
case file
}
var typeMap : [NamedItemType : NamedItem.Type] = [.folder : Folder.self,
.file : File.self]
let p = typeMap[.folder]
"\(p!.init())"
let q = typeMap[.file]
"\(q!.init())"
有趣的方面:
- 初始化者使用“必需”
- 使用.Type获取字典值的类型。
- 使用.self获取可以实例化的“类”
- 使用()实例化动态对象。
- 使用Printable协议获取隐式字符串值。
- 如何初始化使用非参数化的init并从子类初始化中获取值。
更新为Swift 3.0语法