Как вы создаете экземпляр типа динамически на основе значения поиска в словаре в Swift?
Создайте Swift Object из словаря
Ответ 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