Ios Swift3中的阵列滤波器
我有一段代码。我不明白这段代码里面有什么。有人能解释一下吗Ios Swift3中的阵列滤波器,ios,arrays,filter,swift3,Ios,Arrays,Filter,Swift3,我有一段代码。我不明白这段代码里面有什么。有人能解释一下吗 let wordFreqs = [("k", 5), ("a", 7), ("b", 3)] let res = wordFreqs.filter( { (e) -> Bool in if e.1 > 3 { return true } else { r
let wordFreqs = [("k", 5), ("a", 7), ("b", 3)]
let res = wordFreqs.filter(
{
(e) -> Bool in
if e.1 > 3 {
return true
} else {
return false
}
}).map { $0.0 }
print(res)
给出输出:
["k","a"]
wordFreqs
是元组的数组
元组
元组是一组表示为一个值的零或多个值
例如,(“约翰”、“史密斯”)拥有一个人的名字和姓氏。您可以使用点(.)符号和值的索引来访问内部值:
var person = ("John", "Smith")
var firstName = person.0 // John
var lastName = person.1 // Smith
现在,在您的例子中,您有类型为(String,Int)
的元组和类型为filter
的元组,您正在比较e.1>3
(此处e
保存数组迭代中的元组值,使用filter
)表示ssecond(Int)
值大于3
现在,在过滤器
结果上使用映射
,然后从元组中重新调整字符串($0.0)
//array of tuples
let wordFreqs = [("k", 5), ("a", 7), ("b", 3)]
let res = wordFreqs.filter(
{
(e) -> Bool in
//Comparing the Second Int value of tuple in filter
if e.1 > 3 {
return true
} else {
return false
}
})
//Mapping the result of filter
.map {
//return the String from the tuple
$0.0
}
注意。。。如果我写这篇文章,我会把它缩短成
let res = wordFreqs.filter { $0.1 > 3 }
.map { $0.0 }
您的
e
对象表示(字符串,int)
类型。正如您在[(“k”,5),(“a”,7),(“b”,3)]
内的数组中所看到的
首先,您使用的是filter
方法,因此必须返回true
或false
值。在这种情况下,检查e.1
(表示int值)是否大于3,否则返回false。在所有这些处理之后,filter
方法返回经过过滤的(String,int)对象数组
下一步是map
函数。在您的例子中,很简单,它只是将所有数组值映射到元组的第一个对象(String,int)
为了更好地理解您的代码,可以如下所示:
let filteredArray = wordFreqs.filter
({
(e) -> Bool in
return e.1 > 3
})// the filteredArray is [("k", 5), ("a", 7)]
let finalValue = filteredArray.map {
$0.0
}// here you're creating a new array with String. $0 represents object from filteredArray
print(finalValue) // ["k", "a"]
如果我们一个接一个地提取代码的各个部分:
let wordFreqs = [("k", 5), ("a", 7), ("b", 3)]
从一个元组数组开始
根据Swift文件:
元组类型是以逗号分隔的类型列表,用括号括起来
以及:
元组将多个值分组为一个复合值。元组中的值可以是任何类型
在本例中,元组是两个值的“耦合”,一个为String类型,一个为Int类型
此部分在阵列上应用筛选器。您可以在这里看到,过滤器的闭包接受一个元素e(在我们的例子中,是一个元组),并返回一个Bool。使用“filter”函数,返回true意味着保留该值,而返回false意味着将其过滤掉
e.1
语法返回索引1处的元组值。
因此,如果索引1(第二个)处的元组值大于3,则过滤器返回true(因此将保留元组);如果不是,则过滤器返回false(因此从结果中排除元组)。
此时,过滤器的结果将是[(“k”,5),(“a”,7)]
map函数基于元组数组创建一个新数组:对于输入数组($0)的每个元素,它返回索引0处的元组值。因此,新数组是
[“k”,“a”]
这会将结果打印到控制台
这些函数(filter、map、reduce等)在函数式编程中非常常见。
它们通常使用点语法链接,例如,
[1,2,3].filter({}).map({}).reduce({})
简单地说,首先你的数组被过滤(按值>3),然后被映射(键),你可以从苹果的书中阅读更多关于Swift语言的内容。如果有人对我的问题有任何疑问。请给出评论,而不仅仅是负面评价。我想否决票是因为这是一个非常简单的问题,可以通过阅读苹果发布的免费Swift书籍的前几页来回答。在这里提问表明在提问之前理解代码方面缺乏努力。(但不是我的反对票。只是想澄清一下。)我知道这一点,但我想用简单的方式来理解它。当我觉得这个概念对我来说不是很清楚时,我在这里问。有什么不对吗?我不明白为什么人们会否决这个问题。你需要的不仅仅是阅读文档的第一页来理解它,因为它包含许多概念:元组、过滤器、映射、闭包、函数链接等等。。。比如,我投了赞成票。我相信这不是高级程序员的专利,这里欢迎初学者。很好!这里的“e”是什么?当我运行代码时,它不会进入filter方法内部。为什么?@amanpret检查我答案中的括号语句:e.1>3(这里e是用filter保存数组迭代的元组值)
@amanpret同样适用于map
,但在那里它使用$0
@amanpret如果你想删除代码,那么它就像让res=wordFreqs.filter{$0.1>3}.map一样{$0.0}
谢谢。现在我明白了这个概念。谢谢你的解释!很高兴!我还在添加一些细节,让它更容易理解。
let wordFreqs = [("k", 5), ("a", 7), ("b", 3)]
let res = wordFreqs.filter(
{
(e) -> Bool in
if e.1 > 3 {
return true
} else {
return false
}
}).map { $0.0 }
print(res)