Swift字典中一个键的多个值

时间:2019-07-24 15:29:21

标签: swift

我想知道在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"]]

这是否可能是一个好的解决方案?

编辑:

我使用结构解决了我的问题,但是使用元组的建议似乎也帮助我实现了解决方案!

谢谢你解决了:)

4 个答案:

答案 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")]