【问题标题】:Swift: Cannot invoke 'filter' with an argument list of type '((AnyObject) throws -> Bool)'Swift:无法使用类型为“((AnyObject) throws -> Bool)”的参数列表调用“过滤器”
【发布时间】:2016-12-01 03:44:24
【问题描述】:

我正在尝试从字典中过滤。

我的代码如下:

var newSimHistoryArr = [] as NSArray
if self.filterBy == kPending {
    newSimHistoryArr = (dic["simHistory"] as! [AnyObject]).filter {
        return $0 is NSDictionary
    }
} else {
    for a in dic["simHistory"] as! [AnyObject] {
        if a is SimHistory {
            newSimHistoryArr = (dic["simHistory"] as! [AnyObject]).filter {
                return ($0 as! SimHistory).status == self.filterBy
            }
            break
        }
    }
}

在我将项目转换为 Swift 3 之前它运行良好。

错误出现在以下几行:

newSimHistoryArr = (dic["simHistory"] as! [AnyObject]).filter{ return ($0 is NSDictionary)}
newSimHistoryArr = (dic["simHistory"] as! [AnyObject]).filter{ return ($0 as! SimHistory).status == self.filterBy}

错误是:

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

我不知道出了什么问题...

【问题讨论】:

  • 代码看起来不错,但你应该先做一个if let 向下转换为[AnyObject]
  • @Tj3n 它仍然不起作用 - 错误 Cannot call value of function-type Any
  • 你试过谓词吗?
  • 您能否包含更多代码,最好去掉无害的部分?例如,filterBy 是什么?

标签: ios swift swift3


【解决方案1】:

将问题消化到最低限度,您可以在 Playground 中运行的以下代码说明了错误:

var newSimHistoryArr = [] as NSArray
var oldHistory = ["book", "bath", "table"]

newSimHistoryArr  = oldHistory.filter {  $0.hasPrefix("b") }

错误信息是:

游乐场执行失败:错误:MyPlayground.playground:2:32: 错误:无法使用类型为“((字符串)的参数列表”调用“过滤器” throws -> Bool)' newSimHistoryArr = oldHistory.filter { $0.hasPrefix("b") }

奇怪的是,错误的发生不是因为过滤器表达式本身,而是因为它被转换为的数据类型,即赋值左侧的数据类型。这对编译器非常有误导性。

将 newSimHistoryArr 的数据类型更改为兼容的类型,一切正常。

var newSimHistoryArr:[String]
var oldHistory = ["book", "bath", "table"]

newSimHistoryArr  = oldHistory.filter {  $0.hasPrefix("b") }

甚至更繁琐的形式:

var newSimHistoryArr = [] as NSArray
var oldHistory = ["book", "bath", "table"]

newSimHistoryArr  = (oldHistory.filter {  $0.hasPrefix("b") }) as NSArray

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。在我的例子中,如果有人想知道,只需将整个右侧表达式包装到括号中就可以了。

    【讨论】:

      【解决方案3】:

      您应该能够在传递给filter 的匿名函数的开头删除return

      传递给过滤器的函数可能不应该throw。你的表达式可以,所以也许你需要在其中插入一个 try 并在它们抛出时返回 false

      我不明白为什么 is 运算符可能会抛出,但 as! 看起来很吓人。也许将as? 运算符与guard 结合使用可能会通过将潜在的转换错误转换为更易于处理的可选结果来避免出现问题的可能性。

      【讨论】:

      • as!throw;如果没有价值,它会崩溃,但它永远不会throws。
      猜你喜欢
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多