gpt4 book ai didi

ios - 无法使用类型为 'contains' 的参数列表调用 '([Foo], Foo)'

转载 作者:可可西里 更新时间:2023-11-01 00:16:55 24 4
gpt4 key购买 nike

我试图在 swift 中使用 contains 函数来查看我的对象是否在类型化数组中,但我得到:

Cannot invoke 'contains' with an argument list of Type '([Foo], Foo)'

class Foo {

}

let foo = Foo()
let foos = [Foo(), Foo()]

contains(foos, foo)

为什么会这样?

更新#1

我已经实现了 == 函数,但我仍然遇到同样的错误。我这样做不当吗?

class Foo {}

func ==(lhs: Foo, rhs: Foo) -> Bool {
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}

let foo = Foo()
let foos = [Foo(), Foo()]

contains(foos, foo)

最佳答案

类不会自动从基类继承任何相等逻辑,因此您需要显式并让 Foo 符合 Equatable 协议(protocol)。

实际上,编译器可以从该类声明中派生出的唯一合理的相等性是标识,而您可能不希望这样。

请注意

class Foo {}

不一样

class Foo : NSObject { }

通过从 NSObject 继承,您还继承了 isEqual 的默认实现,它提供了对象标识相等性。


关于您的上次更新,您只是在类定义中缺少 Equatable 协议(protocol)。下面编译就好了

class Foo : Equatable {}

func ==(lhs: Foo, rhs: Foo) -> Bool {
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
// or simply
// return lhs === rhs
}

let foo = Foo()
let foos = [Foo(), Foo()]

contains(foos, foo)

或者简单地继承自NSObject,它已经提供了身份平等

class Foo : NSObject {}

let foo = Foo()
let foos = [Foo(), Foo()]

contains(foos, foo)

关于ios - 无法使用类型为 'contains' 的参数列表调用 '([Foo], Foo)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28285611/

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