【问题标题】:Cannot invoke 'filter' with an argument list of type '((_) -> _)'无法使用类型为“((_)-> _)”的参数列表调用“过滤器”
【发布时间】:2015-04-29 14:23:57
【问题描述】:

听起来很荒谬,但我无法修复这段代码:

self.runningScripts.filter({ $0 != scriptRunner })

无论我如何编写闭包,我总是会收到此错误:

无法使用“((_) -> _)”类型的参数列表调用“过滤器”

runningScripts 是这样定义的:

var runningScripts = [ScriptRunner]()

ScriptRunner 是一个 Swift 类(不继承自 NSObject)

我在许多其他地方使用几乎相同的方法没有问题。有什么建议吗?

【问题讨论】:

    标签: swift


    【解决方案1】:

    如果您没有使ScriptRunner 符合Equatable,您可能会收到该错误:

    class ScriptRunner : Equatable {
        // the rest of your implementation here
    }
    
    func ==(lhs: ScriptRunner, rhs: ScriptRunner) -> Bool {
        return ... // change this to whatever test that satisfies that lhs and rhs are equal
    }
    

    【讨论】:

    • ...或者您可以将其设为 NSObject 的子类(符合Equatable)。就在那一刻发现了。无论如何,谢谢你! (实际上我想使用!==...)
    • 我会小心使用NSObject 技术。它使== 的行为更像===,除非你用更合乎逻辑的东西覆盖isEqual(或者自己实现==,在这种情况下,只符合Equatable 更简单)。
    • 感谢您的警告。我刚刚意识到,在写完评论后,这就是为什么我添加了“实际上我想使用!==...
    • 啊。没有看到您的评论的更新。如果你真的想要!==,那么EquatableNSObject 子类都不需要。大声笑。
    【解决方案2】:

    我需要这样的显式转换:

    @NSManaged private var storage: [String]
        private var  objects: Set<String>?
        func remove(element:String) {
            initSetIfNeeded()
            if(objects!.contains(element)) {
                objects!.remove(element)
                storage = storage.filter({($0 as NSObject) !== (element as NSObject)}) // Explicit cast here!!
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多