gpt4 book ai didi

arrays - Swift 无法使用类型为 'find' 的参数列表调用 '([Score], Score)',其中 Score 是一个结构

转载 作者:搜寻专家 更新时间:2023-10-30 22:02:29 26 4
gpt4 key购买 nike

虽然 find(["a", "b"], "c") 没有问题,但在尝试查找结构数组中的结构索引时出现错误:

struct Score
{
//...
}

var scores: [Score] = //...
var score: Score = //...

find(self.scores, score) // Error: Cannot invoke 'find' with an argument list of type '([Score], Score)'

我认为这可能是默认情况下无法相互比较的结构的问题。但是将 Score 的定义更改为 class 给我同样的错误。

最佳答案

编辑:从 Swift 2.0 开始,现在有一个内置版本 find这需要一个闭包,所以你不必自己写——而且,find已更名为indexOf , 现在是 CollectionType 的协议(protocol)扩展,因此您可以将其称为方法:

// if you make `Score` conform to `Equatable:
if let idx = self.scores.indexOf(score) {

}

// or if you don't make it Equatable, you can just use a closure:
// (see original answer below for why you might prefer to do this)
if let idx = scores.indexOf({$0.scoreval == 3}) {

}

下面是 2.0 之前的原始答案


虽然建议您类的答案 Equatable可能工作得很好,我建议在选择这样做之前要谨慎一些。原因是,正如文档所述,等同性意味着可替代性,而您的 ==运算符必须是自反的、对称的和可传递的。如果您不遵守这一点,在使用像 equals 这样的算法时,您可能会遇到一些非常奇怪的行为。 , sort等。如果实现Equatable要特别小心在非期末类(class)上。如果你确定你能满足要求,那就去吧,find将工作。

如果没有,您可以考虑的替代方案是编写一个应该在标准库中但不在标准库中的函数,它是一个find。需要关闭:

func find<C: CollectionType>(source: C, match: C.Generator.Element -> Bool) -> C.Index {
for idx in indices(source) {
if match(source[idx]) { return idx }
}
return nil
}

有了这个之后,您就可以提供您喜欢的任何匹配条件。例如,如果您的对象是类,您可以使用引用相等性:

let idx = find(scores) { $0 === $1 }

关于arrays - Swift 无法使用类型为 'find' 的参数列表调用 '([Score], Score)',其中 Score 是一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29718195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com