数组 – Swift:在调用indexOf之后,使用filter函数过滤后,不能将类型的值转换为@noescape

前端之家收集整理的这篇文章主要介绍了数组 – Swift:在调用indexOf之后,使用filter函数过滤后,不能将类型的值转换为@noescape前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Swift 2中,我收到一个错误

Cannot convert value of type '[String:AnyObject]' to expected argument type '@noescape ([String:AnyObject])' throws -> Bool”

//today = NSDate()
//array : [[String:AnyObject]]
// I use if let because of we might now get element in the array matching our condition

if let elementOfArray = array.filter({$0["id"] as? Int == anotherDictionary["matchID"] as? Int && ($0["nextFireDate"] as? NSDate)?.compare(today) == NSComparisonResult.OrderedAscending}).first {

   let index = array.indexOf(elementOfArray) // error here
}

我做错了什么?我不明白:/

我的目标是找到该项目的索引,我认为我打开替代解决方案,但当然这是首选,因为我认为这是“正确的方式”。

Swift数组上的indexOf方法不会获取与数组类型匹配的类型的对象。相反,它需要关闭。该关闭采用数组类型的元素并返回一个bool。

所以,实际上,除非我们实际需要结果的数组,否则我们不会(而且不应该)甚至打扰过滤器调用。如果我们只是寻找第一个通过任何您正在过滤的测试的对象,那么我们只需要将相同的测试传递给indexOf。

所以,为了保持简单,如果我们有一个数组的字符串(我们假设它们都是单字母的字符串,很多重复),我想找到字符串“a”的第一个索引,而不是过滤将数组转换为“a”的字符串,然后找到通过第一个方法传递该测试的第一个字符串,然后找到该确切对象的索引,而不是将该测试传递到indexOf方法中:

let letters: [String] = ["x","y","z","a","b","c"]

let index = letters.indexOf {
    $0 == "a"
}

为了清楚起见,似乎简单地传递一个单独的元素并寻找在某些情况下确实有效。它可能依赖于Swift的Equatable协议。我可以这样简单地使用used letters.indexOf(“a”)。编译器本来会很开心但是显然,并不是每个数组都被组合成持有符合Equatable的东西,而且数组不能对如何比较其元素做出假设。在这些情况下,您将必须使用上述传递闭包的示例。可能值得注意的是,将这个闭包传递给indexOf而不是首先过滤,然后调用indexOf将会非常有效地提高效率,即使您的数组允许使用letters.indexOf(“a”)方法。例如,如果我有更复杂的字符串,而且我只想要以字母“a”开头的第一个字符串,这比从原始数组过滤到以“一个’。

猜你在找的Swift相关文章