Swift:在使用过滤器函数过滤后调用indexOf时无法将类型值转换为@noescape

2024-04-10

在 Swift 2 中,我收到一个错误:

无法转换类型值'[String:AnyObject]'预期的参数类型'@noescape ([String:AnyObject])'抛出 -> 布尔”

//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
}

我做错了什么?我无法理解。 :/

我的目标是找到该项目的索引,我认为我愿意寻求替代解决方案,但当然这个是首选,因为我认为这是“正确的方法”。


The indexOfSwift 数组上的方法不接受与数组类型匹配的类型的对象。相反,它需要一个关闭。该闭包采用数组类型的元素并返回布尔值。

所以,事实上,我们甚至不(也不应该)操心filter除非我们确实需要结果,否则调用array。如果我们只是寻找第一个通过您正在过滤的任何测试的对象......那么我们只需将完全相同的测试传递给indexOf.

因此,为了简单起见,如果我们有一个字符串数组(假设它们都是具有大量重复的单字母字符串),并且我想找到该字符串的第一个索引"a",而不是将数组过滤为字符串"a",然后找到第一个通过该测试的字符串first方法,然后找到该确切对象的索引,相反,我只是将该测试传递到indexOf method:

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

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

为了清楚起见,在某些情况下,简单地传递单个元素并查找它似乎确实有效。它可能依赖于 Swift 的一致性Equatable协议。例如,我可以简单地使用letters.indexOf("a")这里。编译器会很高兴。但显然,并不是每个数组都需要保存符合以下条件的内容:Equatable,并且数组无法假设如何比较其元素。在这些情况下,您将必须使用上面传递闭包的示例。可能值得注意的是,将这个闭包传递给indexOf而不是先过滤然后调用indexOf无论如何,即使你的数组​​允许letters.indexOf("a")方法。例如,如果我有更复杂的字符串,并且我只想要以字母“a”开头的第一个字符串,那么这比从原始数组过滤到以“a”开头的字符串数组要高效得多。 A'。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift:在使用过滤器函数过滤后调用indexOf时无法将类型值转换为@noescape 的相关文章

随机推荐