我想定义一个字典,它允许值的多种特定类型。我目前可以这样定义一个字典:
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>()我可以使用运行时类型检查来构建它,但我更希望它在编译时强制执行。这有没有可能呢?
发布于 2016-07-12 08:44:02
如果您希望Dictionary的值可以是String、Int、Bool或MyClass,则应该
定义您的协议
protocol MyDictionaryValue { }使字符串、整数、布尔值和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() // errorhttps://stackoverflow.com/questions/38318269
复制相似问题