ios - Swift:无法使用 'filter' 类型的参数列表调用 '((AnyObject) throws -> Bool)'

标签 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}

错误是:

Cannot invoke 'filter' with an argument list of type '((AnyObject) throws -> Bool)'

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

最佳答案

将问题分解到最低级别,您可以在 Playground 中运行以下代码,它说明了错误:

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

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

错误消息是:

Playground execution failed: error: MyPlayground.playground:2:32: error: cannot invoke 'filter' with an argument list of type '((String) 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

关于ios - Swift:无法使用 'filter' 类型的参数列表调用 '((AnyObject) throws -> Bool)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40902274/

相关文章:

ios - 在重复的 UIViewsController 之间定位特定的 UIViewController 实例

swift - 从数字 Swift 初始化一个类

ios - 如何使用 swift 3 删除按钮的图像

core-data - Swift 3 中的 managedObjectContext

objective-c - 使用 Swift 4 在 Xcode 9 上找不到“ProjectName-Swift.h”文件?

ios - 具有图像背景和模糊效果的 TableView - swift

objective-c - If-Else 语句被翻转

iphone - 无法在 iphone 3G 上使用 AVAssetWriter 从 UIImage 数组制作电影

ios - SpriteKit SKLabelNode 对齐

ios - 在 Firebase 上注册新用户时出错