swi*_*lor 0 generics dictionary swift
我想定义一个允许多种特定类型的值的字典。我目前可以定义这样的字典:
var foo = [String: String]
Run Code Online (Sandbox Code Playgroud)
将值限制为一种特定类型
或者
var foo = [String: AnyObject]
Run Code Online (Sandbox Code Playgroud)
它将值限制为 AnyObject,它没有特别限制。
我想做类似的事情:
var foo = [String: <String, Int>]
Run Code Online (Sandbox Code Playgroud)
这将允许我在此字典中仅插入字符串或整数作为值。
我已经考虑过使用枚举,如下所示:Swift 中的通用字典值类型,但我更愿意找到一种方法,允许我动态指定类型而无需扩展或创建新的枚举。
var bar = [String: <String, Int, Bool, MyClass>]
Run Code Online (Sandbox Code Playgroud)
似乎我应该能够创建一个带有 [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>()
Run Code Online (Sandbox Code Playgroud)
我可以使用运行时类型检查来构建它,但我宁愿在编译时强制执行它。这有可能吗?
如果你想要 aDictionary值可以是 a String, an Int, aBool或 aMyClass你应该
protocol MyDictionaryValue { }
Run Code Online (Sandbox Code Playgroud)
extension String: MyDictionaryValue { }
extension Int: MyDictionaryValue { }
extension Bool: MyDictionaryValue { }
extension MyClass: MyDictionaryValue { }
Run Code Online (Sandbox Code Playgroud)
var dict = [String:MyDictionaryValue]()
Run Code Online (Sandbox Code Playgroud)
dict["a"] = "a string"
dict["b"] = 1
dict["c"] = true
dict["d"] = MyClass()
dict["e"] = CGPointZero // error
dict["f"] = UIView() // error
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
432 次 |
| 最近记录: |