gpt4 book ai didi

arrays - 无法返回过滤后的数组

转载 作者:行者123 更新时间:2023-11-30 10:05:51 24 4
gpt4 key购买 nike

概述

我是 Swift 语言的新手,但对其他语言不熟悉,并且在执行简单的 Array.filter 时遇到问题我想作为我正在编写的类中的函数的结果返回的语句,但似乎添加了 return关键字会导致不直观的编译错误。

问题:有谁知道这些错误消息的含义以及如何修复它们?

示例

声明

var arrDictIVar = [["dictVar1": "value"]]
...
func someFunc(var1: String) {...

各种试验

设置 1

return arrDictIVar.filter({
$0["dictVar1"] == var1
})

return arrDictIVar.filter(){
$0["dictVar1"] == var1
}

return arrDictIVar.filter{
$0["dictVar1"] == var1
}

错误: Cannot invoke 'filter' with an argument list of type '(@noescape ([String : String]) throws -> Bool)'
错误潜台词: Expected an argument list of type '(@noescape (Self.Generator.Element) throws -> Bool)'

来源:Sample MCVE Execute here

设置 2

return arrDictIVar.filter({
$0["dictVar1"] == var1
})[0]

return arrDictIVar.filter() {
$0["dictVar1"] == var1
}[0]

return arrDictIVar.filter{
$0["dictVar1"] == var1
}[0]

错误: Cannot subscript a value of type '[[String : String]]'

来源:Sample MCVE Execute here

设置 3

arrDictIVar.filter({
$0["dictVar1"] == var1
})

arrDictIVar.filter(){
$0["dictVar1"] == var1
}

arrDictIVar.filter{
$0["dictVar1"] == var1
}

警告: Result of call to 'filter' is unused注意:只是为了表明该 block 已正确形成,没有 return关键字。

来源:Sample MCVE (Execute here)

其他信息

我还尝试将 IVar 声明修改为 var arrDictIVar: Array<Dictionary<String,String>> = [... ,并将函数声明为 func someFunc(var1: String) -> Dictionary<String,String>{...在不同的时间,都有类似的失败。

编辑:我发布了an answer在提出这个问题的同时,我发现了一个组合,可以帮助本文接近尾声。它确实包括更改方法签名中的返回数据类型,以及提供其他信息来暗示编译器的不准确或至少令人困惑的性质,以及它呈现的错误消息。

此后我留下了一个后续问题:

If anyone would be able to explain why this was happening, and give a clear judgement as the compiler error message was not as helpful as it could be, my reading/interpretation of the error message was not as clear as it could have been, potentially saving time by changing my mindset somehow, or either, please comment on that note.

Victor Sigler's answer似乎确实详细介绍了这一点。

最佳答案

让我们详细解释一下您在问题中提出的每组内容:

Set 1:

您的三个示例在代码中是正确的,并且对于编译器来说是相同的,您使用的是尾随闭包,并且可以省略括号。

有时编译器(因为它还太年轻!!!)不会显示代码中发生的确切错误,但在这一步中,您肯定会使用 filter 函数返回一个 [[String: String]] 或字典数组,并且您缺少函数返回的类型,编译器将其假定为 Void

关于@noescape:

添加@noescape可保证闭包不会存储在某处、稍后使用或异步使用。请记住,闭包捕获值。

您可以在以下两个非常好的教程中阅读有关 @noescape 子句的更多信息:

因此,要恢复它,如果将函数更改为以下内容,它应该可以工作:

func someFunc(var1: String) -> [[String: String]] {
return arrDictIVar.filter({
$0["dictVar1"] == var1
})
}

Set 2:

如果您修复了组 1 中的错误,那么当您编码时:

return arrDictIVar.filter{
$0["dictVar1"] == var1
}[0]

您尝试返回 [String: String] 或字典,但函数的返回类型是错误的 [[String: String]] .

但要小心,因为如果将返回类型更改为 [String: String] 并尝试索引为 filter 函数返回的数组,则不会发现任何内容filter 函数会出现运行时错误。

Set 3

我认为它更容易理解,因为正如警告所述,filter函数返回一个新的元素列表,如果您不保存它或在函数中返回它,它就不会被使用,像这样的东西:

func someFunc(var1: String){
arrDictIVar.filter({
$0["dictVar1"] == var1
})
}

希望这对您有帮助。

关于arrays - 无法返回过滤后的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36021931/

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