Создайте Swift Object из словаря

Как вы создаете экземпляр типа динамически на основе значения поиска в словаре в Swift?

Ответ 1

Надеюсь, это полезно для других. Для выяснения этого потребовались некоторые исследования. Цель состоит в том, чтобы избежать анти-шаблона гигантских операторов 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 для получения неявных строковых значений.
  • как инициализировать без инициализации без параметров и получить значения из инициализации подкласса.

Обновлен синтаксисом Swift 3.0