Swift字典全部包含

时间:2016-04-14 21:00:46

标签: swift dictionary

假设我有类似下面的词典,想要一系列红狗。我想我需要使用第一个字典获取“dog”类型的所有名称的数组,然后使用名称键和颜色来搜索最终字典以获得[“Polly”,“jake”]。我尝试使用循环,但无法弄清楚如何遍历字典。

var pets = ["Polly" : "dog", "Joey" : "goldfish", "Alex" : "goldfish", "jake" : "dog"]

var petcolor = ["Polly" : "red", "Joey" : "black", "Alex" : "yellow", "jake":red"]

3 个答案:

答案 0 :(得分:1)

正确的解决方案似乎是创建一个Pet结构(或类)并将所有这些信息整理到一个结构中,并构建一个充满这些值的数组或字典。

struct Pet {
    let name: String
    let type: String
    let color: String

    init(name: String, type: String, color: String) {
        self.name = name
        self.type = type
        self.color = color
    }
}

现在,让我们构建一系列宠物:

var goodPets = [Pet]()

for (petName, petType) in pets {
    guard let petColor = petcolor[petName] else {
        // Found this pet's type, but couldn't find its color. Can't add it.
        continue
    }

    goodPets.append(Pet(name: petName, type: petType, color: petColor))
}

现在我们已经填写了goodPets,删除任何特定的Pets子集变得非常

let redDogs = goodPets.filter { $0.type == "dog" && $0.color = "red" }

虽然这个答案看起来像很多设置&腿部工作与其他答案相比,这里的主要优点是,一旦我们构建goodPets数组, 任何 方式,我们希望将宠物从那里挖出来最终成为更高效。随着我们增加宠物的属性数量,与其他答案相比,这变得越来越真实。

如果您宁愿将模型对象存储在继续使用名称作为键的字典中,我们也可以这样做,但过滤器看起来有点奇怪。

构建字典看起来大多数相同:

var goodPets = [String : Pet]()

for (petName, petType) in pets {
    guard let petColor = petcolor[petName] else {
        // Found this pet's type, but couldn't find its color. Can't add it.
        continue
    }

    goodPets[petName] = (Pet(name: petName, type: petType, color: petColor))
}

但过滤器略有不同:

let redDogs = goodPets.filter { $0.1.type = "dog" && $0.1.color = "red" }

请注意,在这两种情况下,redDogs都有[Pet]类型,即Pet值数组。

答案 1 :(得分:0)

你可以迭代这样的字典:

for key in pets.keys() {
    if pets[key] == "Dog" {

    }
}

或者:

for (name, pet) in pets {
    if pet == "Dog" {
    }
}

答案 2 :(得分:0)

nhgrif对于结构可能是正确的,但要回答字面上的问题:

let dogs = Set(pets.filter { $0.1 == "dog" }.map { $0.0 })
let redAnimals = Set(petscolor.filter { $0.1 == "red" }.map { $0.0 })

let redDogs = dogs.intersect(redAnimals)

每个filter是一个对(key,value)元组进行操作的块,测试该值并最终创建仅包含匹配(键,值)对的字典。然后,每个map通过丢弃值并保留密钥,将过滤后的字典转换为数组。

每个数组都变成一个集合以支持intersect操作。然后intersect确定两个结果的交集。