具有扩展类型约束的Swift字典

时间:2016-07-12 00:38:24

标签: swift generics dictionary

我想定义一个字典,允许多个特定类型的值。我现在可以定义这样的字典:

var foo = [String: String]

将值约束为一种特定类型

OR

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>()

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

1 个答案:

答案 0 :(得分:4)

如果你想Dictionary的价值可以是StringIntBoolMyClass你应该

定义您的协议

protocol MyDictionaryValue { }

Conform String,Int,Bool和MyClass to 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