gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:14:20 27 4
gpt4 key购买 nike

在 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 值。

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

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

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

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

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

关于arrays - Swift:在调用 indexOf 时无法将类型的值转换为 @noescape,在使用过滤函数进行过滤之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33436331/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com