【问题标题】:Cannot convert value of type 'Option' to expected argument type '@noescape (Option) throws -> Bool'无法将“选项”类型的值转换为预期的参数类型“@noescape (Option) throws -> Bool”
【发布时间】:2015-11-09 17:25:37
【问题描述】:

我有一个名为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 的版本更新为 Swift 2 版本)。我将代码更新为此。

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

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

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

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

我不知道为什么。有什么想法吗?

【问题讨论】:

    标签: ios arrays swift swift2 realm


    【解决方案1】:

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

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

    它的作用是将闭包传递给函数,仅当该闭包满足其任何元素时,该函数才返回 true。 $0 代表 contains 函数正在测试的数组中的当前元素,如果该元素等于您要查找的元素,则返回 true。

    【讨论】:

    • 请注意,有 两个 contains 方法:一个采用单个元素,另一个采用闭包。
    • @MartinR 显然单个元素现在仅适用于 Equatable 类型。
    • 没错!您应该将其添加到答案中,否则会产生误导。
    • @MartinR 起初它不存在的原因是因为我在我的项目中测试了非平等类型的代码。如果我在Strings 的数组上进行测试,也许我会更早知道
    【解决方案2】:

    虽然第一个答案表明发生此问题是因为 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      相关资源
      最近更新 更多