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

Posted

技术标签:

【中文标题】Swift:在使用过滤器函数进行过滤后,调用 indexOf 时无法将类型的值转换为 @noescape【英文标题】:Swift: cannot convert value of type to @noescape while call indexOf, after filter using filter function 【发布时间】:2016-01-30 21:34:56 【问题描述】:

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

无法将 '[String:AnyObject]' 类型的值转换为预期的参数类型 '@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

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

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

【问题讨论】:

代替... 的实际代码是什么样的?我不知道这是否重要,但如果有人可以将您所获得的内容复制并粘贴到操场上以查看确切的错误,这可能会有所帮助。 @nhgrif 我认为这没关系,简而言之,这段代码通过字典键/值匹配找到了恰好一行。 这可能无关紧要,但 Swift 允许我们将这么多压缩成这么少。问题应该清楚地说明确切的问题是什么。我自己在操场上玩这个。我们实际上可以删除整个if let。你真的应该把这个问题简化为只有 indexOf 调用和产生的实际错误是这里的问题。 @nhgrif,好的,这不是秘密,几秒钟后看到更新。 【参考方案1】:

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

因此,事实上,我们甚至不(也不应该)为filter 调用而烦恼,除非我们确实需要生成的数组。如果我们只是在寻找第一个通过您过滤的任何测试的对象......那么我们只需将完全相同的测试传递给indexOf

所以,为了简单起见,如果我们有一个字符串数组(假设它们都是有很多重复的单字母字符串),我想找到字符串 "a" 的第一个索引,而不是而不是将数组过滤为"a" 的字符串,然后使用first 方法找到通过该测试的第一个字符串,然后找到该确切对象的索引,相反,我只是将该测试传递给@987654327 @方法:

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' 开头的字符串,这将比从原始数组过滤到以 ' 开头的字符串数组开始要高效得多一个'。

【讨论】:

几乎!哦,看起来这就是答案。 两种 indexOf方法,一种取元素,一种取谓词。 ["x", "y", "z", "a", "b", "c"].indexOf("a") 编译没有问题。 @MartinR,但至少这不是字典。 @MartinR 确实如此。我在那里添加了一个大脚注。我相当有信心“简单”的只有 Equatable 类型可用(这解释了为什么 flinth 可能看不到它)。但另外,正如我所解释的,在某些情况下,即使是 Equatable 类型,您也不想忽略谓词重载。 @nhgrif:是的,现在看到你的附录了。

以上是关于Swift:在使用过滤器函数进行过滤后,调用 indexOf 时无法将类型的值转换为 @noescape的主要内容,如果未能解决你的问题,请参考以下文章

flask中自定义过滤器

Vue过滤器

Vue过滤器

filter in servlet

flask过滤器

Cognos:使用聚合函数后进行过滤