在一个对象数组中搜索一个数组

时间:2016-07-21 17:15:03

标签: arrays swift

我需要搜索数组中的每个对象"英雄"对于每个英雄(abathur,chromie等等),其中有一个项目的协同作用数组等于" Xul"。(" Xul"最终将变为用户输入的变量)。然后我需要增加" pickValue"每个匹配的属性。

因此,在此示例中,搜索将匹配chromie并增加其选择值。

下面这个过滤器让我把匹配的项目放到另一个阵列中,但我不认为过滤器可以用于我想要的东西,因为我需要保留阵列"英雄"在机智和只是增加财产" pickValue"

let filteredHeroes = heroes.filter( { $0.synergy.contains("Xul") } )

我让自己疯狂地寻找如何做到这一点,我无法找到它。我一直关注的教程也没有触及这个。以下是其他相关信息。

class Hero{

    var name: String
    var role: String
    var synergy: [String]
    var strong: [String]
    var weak: [String]
    var pickValue = 0

    init(name: String, role: String, synergy: [String], strong: [String], weak: [String]){
        self.name = name
        self.role = role
        self.synergy = synergy
        self.strong = strong
        self.weak = weak
    }

}
// there are about 50 of these "heroes"
    var abathur = Hero(name: "Abathur", role: "Ranged Specialist", synergy: ["Illidan", "Chromie"], strong: ["Tracer", "Murky"], weak: ["Zeratul", "Nova"])
    var chromie = Hero(name: "Chromie", role: "Ranged Assassin", synergy: ["Xul", "Johanna"], strong: ["Abathur", "Zagara"], weak: ["Tracer", "Greymane"])


var heroes = [Hero]()
heroes.append(abathur) // appended all heroes
heroes.append(chromie)

4 个答案:

答案 0 :(得分:1)

提供的所有答案都是正确的,它们允许您修改原始数组中的pickValue而不会丢失任何元素。

原因是英雄:[Hero]是一个对象数组而不是Structs数组。使用.map(),. filter()等对象操作对象数组时,获取的新数组包含对原始数组的相同对象实例的引用。因此,从新数组中进行更改实际上也会修改原始数组中的Hero。

如果英雄是一个结构,那么你确实会遇到你似乎担心的问题。

答案 1 :(得分:0)

您可能希望使用map()flatMap()功能。如果您在Google上搜索“Swift高阶函数”并查找这两个函数,您会看到一些非常好的文章,介绍如何将它们用于您正在寻找的内容。

答案 2 :(得分:0)

这适用于我的班级:

print(chromie.pickValue)

updatePickValue(heroes, withValue: 1, forSynergy: "Xul")

print(chromie.pickValue)

在实际操作中,您可以使用以下方法进行测试:

{{1}}

编辑:澄清问题

答案 3 :(得分:0)

为了澄清,filter不会修改它所调用的集合。它会为您创建一个 new 集合。所以你最初的想法应该可行。如果要对此进行测试,请尝试在定义为常量的数组上调用filter(使用let)。

然而,这是另一种做你要求的方式:

var synergyList:Set<String> = ["Xul"]

heroes.forEach { (hero:Hero) -> () in
    hero.pickValue = synergyList.intersect(hero.synergy).count
}

打印结果如下:

for hero in heroes {
    print("Hero: \(hero.name), Pick Value: \(hero.pickValue)")
}

给出:

Hero: Abathur, Pick Value: 0
Hero: Chromie, Pick Value: 1

附加到synergyList并重新运行forEach会相应地更新pickValue