【问题标题】:Creating a [string : Class] dictionary in Swift 4在 Swift 4 中创建一个 [string : Class] 字典
【发布时间】:2018-06-08 21:52:10
【问题描述】:

我一直在寻找一种在快速字典中存储的方法,将字符串作为键,将类作为值

基本上,我想存储: [ “视图”:UIView.self, “段”:UISegmentedControl ]

这样我就可以解析 json 并将参数与字典中保存的类进行比较,如下所示:

func checkObject<T>(_ object : T, forKey key : String) -> Bool {
   if let d = dictionary_of_string_classes[key], d.self == T.self {
     return true
   }

   return false
}

但是,解决方案的实施在 2 天后让我忽略了

任何帮助表示赞赏

【问题讨论】:

  • 你能在字典中使用 Any 类型吗?喜欢:字典()
  • 我想不出我真的想这样做的理由吗?但基本上您可以使用 AnyObject 类型、公共.. 父类或所有元素之间共享的协议(更快捷的方式)来执行此类操作。你只需要确定这些元素是什么组

标签: swift class generics reflection types


【解决方案1】:

你觉得这个解决方案怎么样?

var dictionary_of_string_classes: [String: Any.Type] = [:]
dictionary_of_string_classes["1"] = String.self
dictionary_of_string_classes["2"] = URL.self

func checkObject<T: Any>(_ object : T.Type, forKey key : String) -> Bool {
    return dictionary_of_string_classes[key] == object.self
}

print(checkObject(String.self, forKey: "1")) // true
print(checkObject(String.self, forKey: "2")) // false

【讨论】:

    【解决方案2】:

    也许是这样的

    var dictionary_of_string_classes: [String: NSObject.Type] = [:]
    dictionary_of_string_classes["hello"] = UITableView.self
    
    func checkObject<T>(_ object : T, forKey key : String) -> Bool {
    
        if let d = dictionary_of_string_classes[key], d.self is T {
            return true
        }
    
        return false
    }
    
    checkObject(UICollectionView.self, forKey: "hello") //false
    checkObject(UITableView.self, forKey: "hello") //true
    

    【讨论】:

    • 关闭但不完全,需要存储我不拥有的不相关的类(我已经有与你类似的解决方案)。想象一下尝试在那里存储任何 Foundation 或 UIKit 或 MapKit 类
    • NSObject 类呢?类似于 dictionary_of_string_classes: [String: NSObject.Type] = [:]
    • 再次感谢您的输入,但它也应该能够处理 POSO 对象,该功能是在框架中构建的,并且任何客户端代码都应该能够注册他们想要的任何类(包括他们的自己的普通 swift 类)
    猜你喜欢
    • 2018-01-30
    • 2021-05-21
    • 1970-01-01
    • 2021-03-09
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多