无法将类型 'Option' 的值转换为预期的参数类型“@noescape (Option) throws -> Bool”

Cannot convert value of type 'Option' to expected argument type '@noescape (Option) throws -> Bool'

我有一个叫 Option 的 class。这是一个 Realm 对象,所以它是 Realm 自己的基础 class Object.

的子class

在视图控制器中,我有一个数组 属性,其中包含一堆 Option 个对象。

private var options = [Option]()

在视图控制器下的一个方法中,我需要检查某个 Option 对象是否包含在上述选项数组中。

以前(Swift1.2),我有这样的检查逻辑。

func itemSelected(selection: Object) {
    let option = selection as! Option

    if !contains(options, option) {
        // act accordingly
    }
}

现在我正在将项目转换为 Swift 2(我也将 Realm 的版本更新为 Swift 2 版本)。我将代码更新为这个。

func itemSelected(selection: Object) {
    let option = selection as! Option

    if !options.contains(option) {
        // act accordingly
    }
}

但是现在我遇到了以下编译错误!

无法将类型 'Option' 的值转换为预期的参数类型 '@noescape (Option) throws -> Bool'

我不明白为什么。有什么想法吗?

这是因为 contains 函数现在需要一个闭包,而不是所有非等式类型的元素。您需要做的就是将其更改为以下内容

if !(options.contains{[=10=]==option}) {
    // act accordingly
}

它所做的是将一个闭包传递给函数,returns 仅当该闭包满足其任何元素时才为真。 [=12=] 代表 contains 函数正在测试的数组中的当前元素,如果该元素等于您要查找的元素,则 returns 为真。

虽然第一个答案表明出现此问题是因为 contains 方法需要对 Equatable 类型进行操作,但这是正确的,但这只是故事的一半。领域 Object class 继承 NSObject,它符合 Equatable(因此这应该可以在没有闭包的情况下工作)。有关这方面的更多讨论,您可以在 Realm GitHub 页面上参考此问题:https://github.com/realm/realm-cocoa/issues/2519。 Realm 开发人员表示他们认为这是 Swift.

中的错误

最终,建议的解决方法是重新声明符合 EquatableHashable,就像这样(这是从 GitHub 用户 bdash 对先前发布的评论中逐字复制的问题):

public class A: Object, Equatable, Hashable {
}

public func ==(lhs: A, rhs: A) -> Bool {
    return lhs.isEqual(rhs)
}

您将在该示例中将类型 A 的所有实例替换为类型 Option

我测试了这个解决方案,它适用于 XCode 7.2.1,使用 Swift 版本 2.1.1。