通常我会像这样创建我的swift词典:
var myDict: [String: String]
但是如何创建一个可以包含值,只有String或Bool的词典?
如果我将字典声明为以下代码
var myDict: [String: Any]
然后我的数组现在可以容纳任何我不想要的对象。有没有办法声明字典只接受String
和Bool
值类型?
[编辑] - 用例是:我需要有一个键和值的字典。但我只想将值限制为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 根据下面的答案,我选择了协议方法,因为它在语法上更容易。但正如鲶鱼在评论中提到的那样,它可能会占用更多的内存。
答案 0 :(得分:6)
您可以执行类似
的操作enum StuffThatGoesInMyDictionary {
case Text(String)
case Boolean(Bool)
}
然后让你的词典
var myDict: [String : StuffThatGoesInMyDictionary]
答案 1 :(得分:6)
protocol StringOrBool {
}
extension Bool: StringOrBool {
}
extension String: StringOrBool {
}
var myDict: [String : StringOrBool] = [:]
myDict["testKey"] = "sd" // works
myDict["testKey2"] = false // works
myDict["testKey2"] = 2 // fails
答案 2 :(得分:1)
此解决方案基于 Catfish_Man 的答案,我只是将其设为通用。
使用此枚举
enum XORWrapper<A,B> {
case Value0(A)
case Value1(B)
}
您可以声明一个值包含2个泛型类型的值(例如String
和Bool
)。
let boolOrString: XORWrapper<String, Bool>
然后您可以使用第一个类型(例如String
)
boolOrString = XORWrapper.Value0("Hello world")
或与第二个(例如Bool
)
boolOrString = XORWrapper.Value1(true)