【问题标题】:Create a Swift Object from a Dictionary从字典创建 Swift 对象
【发布时间】:2014-10-10 01:19:08
【问题描述】:

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

【问题讨论】:

  • 不幸的是,您现在编辑了这个问题,完全认不出来了。不再清楚问题是什么或解决方案是什么。最好恢复到原始问题并将答案作为答案,而不是作为覆盖原始问题的问题的编辑。
  • 是的,这不再是一个问题了。我现在把它变成一个问题,这样更好吗?还是我应该回去?
  • 基本上你在 Swift 中根本做不到。然而,你可以在 Objective-C 中做到这一点,而且 Swift 完全能够与 Objective-C 对象交互。请注意,任何继承 NSObject 的东西都不是 swift 对象,它是一个 Objective-C 对象。它们的行为基本相同,但 Objective-C 可以是动态的,但还有其他缺点(例如:它们要慢得多)。
  • Abhi,在我的测试中,将 NSObject 作为基类移除,它仍然可以工作。
  • 即使经过编辑,这个“问题”仍然是一个包含答案的问题。也就是说,“问题”中的代码示例不是演示问题,而是问题的答案。下面的答案不提供答案,而是对问题中包含的答案的评论。我建议编辑“问题”,这样读者就可以清楚地看到它是经过编辑的并且是自我回答的。按照惯例帮助读者。

标签: ios dynamic 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 协议获取隐式字符串值。
  • 如何使用非参数化的 init 进行初始化并从子类初始化中获取值。

更新为 Swift 3.0 语法

【讨论】:

  • 我发现这很有启发性。感谢您分享您的研究成果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2016-01-30
  • 2017-02-02
相关资源
最近更新 更多