从字典创建Swift对象

pos*_*sen 5 dynamic ios swift

如何根据Swift中字典中的查找值动态实例化一个类型?

pos*_*sen 4

希望这对其他人有用。我们需要进行一些研究才能弄清楚这一点。目标是避免巨大的 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())"
Run Code Online (Sandbox Code Playgroud)

有趣的方面:

  • 使用“required”作为初始值设定项
  • 使用 .Type 获取字典值的类型。
  • 使用.self来获取可以实例化的“类”
  • 使用 () 实例化动态对象。
  • 使用 Printable 协议获取隐式字符串值。
  • 如何使用非参数化 init 进行初始化并从子类初始化中获取值。

更新为 Swift 3.0 语法

  • 我发现这很有启发。感谢您分享您的研究。 (2认同)