无法转换类型'选项'的值期望参数类型' @noescape(期权)抛出 - >布尔'

时间:2015-11-09 17:25:37

标签: ios arrays swift swift2 realm

我有一个名为Option的班级。这是一个Realm对象,因此它是Realm自己的基类Object的子类。

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

private var options = [Option]()

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

以前(Swift 1.2),我有这样的检查逻辑。

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

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

现在我将项目转换为Swift 2(我已经将Realm&s版本更新为Swift 2版本)。我将代码更新为此。

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

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

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

无法转换类型'选项'的值期望参数类型' @noescape(期权)抛出 - >布尔'

我无法弄清楚原因。有什么想法吗?

2 个答案:

答案 0 :(得分:9)

这是因为['mark', 'bill', '#special#', #special method#, 'johni']函数现在需要闭包而不是所有非等同类型的元素。您需要做的就是将其更改为以下

contains

它的作用是将闭包传递给函数,只有当闭包满足其任何元素时才返回true。 if !(options.contains{$0==option}) { // act accordingly } 代表$0函数正在测试的数组中的当前元素,如果该元素等于您要查找的元素,则返回true。

答案 1 :(得分:1)

虽然第一个答案,表明出现此问题是因为contains方法需要在Equatable类型上运行,这是真的,这只是故事的一半。领域Object类继承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。