从字典创建Swift对象

时间:2014-10-10 01:19:08

标签: ios dynamic swift

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

1 个答案:

答案 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语法