斯威夫特:无法调用'过滤'使用类型'((AnyObject)throws - > Bool)的参数列表'

时间:2016-12-01 03:44:24

标签: ios swift swift3

我试图从字典中过滤。

我的代码如下:

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)的参数列表'

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

3 个答案:

答案 0 :(得分:2)

将问题消化到最低级别,您可以在游乐场中运行的以下代码说明错误:

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

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

错误信息是:

  

Playground执行失败:错误:MyPlayground.playground:2:32:   错误:无法使用类型'((String)的参数列表调用'filter'   投掷 - > Bool)'newSimHistoryArr = oldHistory.filter {   $ 0.hasPrefix(“b”)}

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

将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

答案 1 :(得分:0)

我有类似的问题。就我而言,如果有人想知道的话,只需将整个右侧表达式包装在括号中即可。

答案 2 :(得分:-2)

您应该可以将return放在要传递给filter的匿名函数的开头。

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

我没有看到is运算符可能抛出的原因,但as!看起来很可怕。也许使用as?运算符与guard结合可能会通过将潜在的投射错误转换为更易于处理的可选结果来避免出现问题的可能性。