首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有扩展类型约束的Swift字典

带有扩展类型约束的Swift字典
EN

Stack Overflow用户
提问于 2016-07-12 08:38:24
回答 1查看 448关注 0票数 0

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

代码语言:javascript
运行
复制
var foo = [String: String]

,它将值约束到一个特定的类型。

代码语言:javascript
运行
复制
var foo = [String: AnyObject]

它将值约束为AnyObject,这并不是特别受约束。

我想做一些类似的事情:

代码语言:javascript
运行
复制
var foo = [String: <String, Int>]

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

我考虑过使用枚举,如下所示:Generic dictionary value type in Swift,但我更愿意找到一种方法,允许我动态指定类型,而无需扩展或创建新的枚举。

代码语言:javascript
运行
复制
var bar = [String: <String, Int, Bool, MyClass>]

看起来我应该能够创建一个带有String: AnyObject内部字典的包装类,它将允许对可以插入的任意长的类列表进行编译时类型检查。

代码语言:javascript
运行
复制
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>()

我可以使用运行时类型检查来构建它,但我更希望它在编译时强制执行。这有没有可能呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-12 08:44:02

如果您希望Dictionary的值可以是StringIntBoolMyClass,则应该

定义您的协议

代码语言:javascript
运行
复制
protocol MyDictionaryValue { }

使字符串、整数、布尔值和MyClass符合MyDictionaryValue

代码语言:javascript
运行
复制
extension String: MyDictionaryValue { }
extension Int: MyDictionaryValue { }
extension Bool: MyDictionaryValue { }
extension MyClass: MyDictionaryValue { }

声明你的字典

代码语言:javascript
运行
复制
var dict = [String:MyDictionaryValue]()

用法

代码语言:javascript
运行
复制
dict["a"] = "a string"
dict["b"] = 1
dict["c"] = true
dict["d"] = MyClass()

dict["e"] = CGPointZero // error
dict["f"] = UIView() // error
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38318269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档