如何制作一个包含特定值的Swift词典?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何制作一个包含特定值的Swift词典?相关的知识,希望对你有一定的参考价值。

通常我会像这样创建我的swift字典:

var myDict: [String: String]

但是,我如何创建一个可以包含值,只有String或Bool的Dictionary?

如果我像下面的代码一样声明字典

var myDict: [String: Any]

然后我的数组现在能够容纳任何我不想要的对象。有没有办法声明字典只接受StringBool值类型?

[编辑] - 用例是:我需要有一个键和值的字典。但我只想将值限制为Strings或Bools。没有其他的。目标是最终使用此Dictionary转换为JSON格式以发送到某个服务器。基于下面的答案,我唯一的选择是枚举还是类/结构?我想知道是否有办法让Bool和String符合某些协议?

这个想法可能是这样声明字典

var myDict : [String: stringOrBool]

并填写这样的字典

myDict["firstKeyStringValue"] = "my first string value" // This should work
myDict["firstKeyBoolValue"] = true // This should work
myDict["someOtherKey"] = 123 // This should fail

编辑2根据下面的答案,我选择了协议方法,因为它在语法上更容易。但正如鲶鱼在评论中提到的那样,它可能会占用更多的内存。

答案
protocol StringOrBool {
}

extension Bool: StringOrBool {
}

extension String: StringOrBool {
}

var myDict: [String : StringOrBool] = [:]

myDict["testKey"] = "sd"   // works
myDict["testKey2"] = false // works
myDict["testKey2"] = 2     // fails
另一答案

你可以做点什么

enum StuffThatGoesInMyDictionary {
    case Text(String)
    case Boolean(Bool)
}

然后让你的字典成为

var myDict: [String : StuffThatGoesInMyDictionary]
另一答案

这个解决方案基于Catfish_Man的答案,我只是把它变成了通用的。

有了这个枚举

enum XORWrapper<A,B> {
    case Value0(A)
    case Value1(B)
}

你可以声明一个包含2个泛型类型值的值(例如StringBool)。

let boolOrString: XORWrapper<String, Bool>

然后你可以使用第一个类型(例如String)填充它

boolOrString = XORWrapper.Value0("Hello world")

或与第二个(例如Bool

boolOrString = XORWrapper.Value1(true)

以上是关于如何制作一个包含特定值的Swift词典?的主要内容,如果未能解决你的问题,请参考以下文章

python 筛选在特定键中具有特定值的词典的词典列表

检查字典是不是包含 Swift 中的值

编程词典 - Swift version V1.0

从使用 wkwebview 返回值的 javascript 调用 swift 函数

我如何制作具有步长值的 UISlider [关闭]

Swift:我如何等到变量具有特定值