我需要搜索数组中的每个对象"英雄"对于每个英雄(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)
答案 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
。