【问题标题】:Swift Dictionary With Expansive Type Constraints具有扩展类型约束的 Swift 字典
【发布时间】:2016-07-12 00:38:23
【问题描述】:

我想定义一个允许多种特定类型的值的字典。我目前可以这样定义字典:

var foo = [String: String]

将值限制为一种特定类型

var foo = [String: AnyObject]

将值限制为 AnyObject,没有特别限制。

我想做这样的事情:

var foo = [String: <String, Int>]

这将允许我在此字典中仅插入字符串或整数作为值。

我已经考虑过使用枚举,如下所示:Generic dictionary value type in Swift,但我宁愿找到一种方法,让我无需扩展或创建新枚举即可动态指定类型。

var bar = [String: <String, Int, Bool, MyClass>]

似乎我应该能够使用 [String: AnyObject] 的内部字典创建一个包装类,这将允许针对可以插入的任意长的类列表进行编译时类型检查。

class ECDictionary<T> {

    private var internal_storage = [String: AnyObject]()

    subscript(s: String) -> T {
        get {
            return internal_storage[s]
        }
        set(newValue) {
            internal_storage[s] = newValue
        }
    }
}


var myECDictionary = ECDictionary<String, Int, OtherClass>()

我可以使用运行时类型检查来构建它,但我宁愿它在编译时强制执行。这有可能吗?

【问题讨论】:

    标签: swift generics dictionary


    【解决方案1】:

    如果你想要一个Dictionary,其中值可以是StringIntBoolMyClass,你应该

    定义你的协议

    protocol MyDictionaryValue { }
    

    使 String、Int、Bool 和 MyClass 符合 MyDictionaryValue

    extension String: MyDictionaryValue { }
    extension Int: MyDictionaryValue { }
    extension Bool: MyDictionaryValue { }
    extension MyClass: MyDictionaryValue { }
    

    声明你的字典

    var dict = [String:MyDictionaryValue]()
    

    用法

    dict["a"] = "a string"
    dict["b"] = 1
    dict["c"] = true
    dict["d"] = MyClass()
    
    dict["e"] = CGPointZero // error
    dict["f"] = UIView() // error
    

    【讨论】:

    • 似乎是限制字典具有特定类型的合乎逻辑的方式
    • 它在 swift 中工作,但我想在目标 c 项目中使用这个 swift 字典它不工作 @objc 协议不工作
    • @objc public protocol MyDictionaryValue { } extension String : MyDictionaryValue{} 错误:非类类型“String”不能符合类协议“MyDictionaryValue”
    猜你喜欢
    • 2020-05-27
    • 2021-12-16
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多