在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”开头的第一个字符串,这比从原始数组过滤到以“一个’。