我需要搜索数组中的“英雄”中的每一个对象,以寻找每个英雄(etc,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)发布于 2016-07-21 23:40:57
提供的所有答案都是正确的,它们将允许您修改原始数组中的pickValue,而不会丢失任何元素。
原因是英雄:英雄是一组对象,而不是结构。当您使用.map()、.filter()等操作对象数组时,获得的新数组包含对与原始数组相同的对象实例的引用。因此,从新数组中进行更改实际上也会修改原始数组中的Hero。
如果英雄是一个结构,那么你确实会遇到你似乎在担心的问题。
发布于 2016-07-21 17:24:56
为此,您可能需要使用map()或flatMap()函数。如果你在谷歌上搜索"Swift高级功能“并寻找这两种功能,你会看到一些非常好的文章,介绍如何使用它们来实现你想要的东西。
发布于 2016-07-21 17:47:53
这对我适用于你的班级:
func updatePickValue(heroes: [Hero], withValue: Int, forSynergy: String) {
let filteredResults = heroes.filter({$0.synergy.contains(forSynergy)})
for hero in filteredResults {
hero.pickValue = withValue
}
}在实际操作中,您可以使用以下方法进行测试:
print(chromie.pickValue)
updatePickValue(heroes, withValue: 1, forSynergy: "Xul")
print(chromie.pickValue)编辑:问题的澄清
https://stackoverflow.com/questions/38510477
复制相似问题