我想知道在Swift中在字典中使用多种值类型的可能性。
例如,如果我有一个名为cats的字典,则该Dict的字符串为“ Bob”。现在,我希望“ Bob”具有2个值,即1个Bool和1个String。例如True和“ Red”
var cat = [String: [Bool, String]]()
以上操作失败
“通用结构'Dictionary'要求'String.Type'符合'Hashable'。
我尝试过
var cat = [Hashable: [Bool, String]]()
但这提供了错误
通用结构“字典”要求“ Hashable.Protocol”符合“ Hashable”
例如,我想要
var cat = ["Bob": [False, "Red"], "Albert": [True, "Black"]]
这是否可能是一个好的解决方案?
编辑:
我使用结构解决了我的问题,但是使用元组的建议似乎也帮助我实现了解决方案!
谢谢你解决了:)
答案 0 :(得分:1)
您正在做的是滥用字典,类型或两者兼而有之。我建议您重新考虑整个方法。如果要将名称与字符串和布尔值关联,请创建一个自定义结构:
struct Person : Hashable {
let name : String
let favoriteColor : String
let knowsSwift : Bool
}
现在,您可以将其存储在Set中并按名称提取其中一个,或者可以按名称或其他方式制作一个Dictionary of Person。
答案 1 :(得分:0)
您收到了错误的错误消息。真正的问题是[Bool, String]
不是有效的类型。无法在特定位置指定具有特定类型的固定长度的数组。而是使用元组:
var cat1 = [String: (Bool, String)]()
var cat2: [String: (Bool, String)] = ["Bob": (false, "Red"), "Albert": (true, "Black")]
答案 2 :(得分:0)
Tuple是您要寻找的:
var cat = [String: (Bool, String)]()
否则最好这样做:
var cat: [String: (Bool, String)] = [:]
您还可以为元组位置添加标签:
var cat: [String: (adult: Bool, color: String)] = [:]
第二个例子
var cat = ["Bob": (false, "Red"), "Albert": (true, "Black")]
或
var cat: [String: (adult: Bool, color: String)] = ["Bob": (false, "Red"), "Albert": (true, "Black")]
答案 3 :(得分:0)
您可以创建一个对象
struct Item {
let isAvailable: Bool
let colour: String
}
var cat = [String: Item]
cat = ["Bob": Item(isAvailable: true, colour: "Red")]