我有一个结构:
struct Info {
var name: String = ""
var number = Int()
var count = Int()
}
var infoProvided : [Info] = []
我要检查名称和号码是否已经填写,如果是,请更新计数器。如果姓名和数字均未填写,我想附加值。
像这样:
//Check if item allready exists, if not append to array
if let index = infoProvided.index(where: { $0.name == name }) && infoProvided.index(where: { $0.number == number }) {
infoProvided[index].count += counter
} else {
infoProvided.append(Info(name: name, number: number, count: counter))
}
上述解决方案不起作用:
“可选类型'Array.Index?” (也称为“可选”)不能用作布尔值;相反,请测试'!= nil'”
如何检查两个值是否存在?
答案 0 :(得分:0)
您似乎想使用匹配的名称和编号来更新Info
实例。
为此,您需要在一次对index(where:)
的调用中检查两者。
if let index = infoProvided.index(where: { $0.name == name && $0.number == number }) {
infoProvided[index].count += counter
} else {
infoProvided.append(Info(name: name, number: number, count: counter))
}
答案 1 :(得分:0)
用index(where:)
重复查找相同的对象会非常低效(每个调用都是O(n)
线性搜索)。最好使用Dictionary,它也可以从根本上简化您的合并/添加逻辑:
struct Info { // TODO: NAME ME BETTER
let name: String
let number: Int // TODO: NAME ME BETTER
}
...代码中的其他地方:
var infoCounts = [Info: Int]
func addNewInfo(name: String, number: Int, count: Int) {
infoCounts[Info(name: name, number: number), default: 0] += count
}