Ama*_*eet 4 arrays filter ios swift3
我有一段代码.我不知道这段代码里面有什么内容.任何人都可以解释一下吗?
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)
Run Code Online (Sandbox Code Playgroud)
给出输出:
["k","a"]
Run Code Online (Sandbox Code Playgroud)
Fré*_*dda 11
如果我们一个接一个地使用这段代码:
let wordFreqs = [("k", 5), ("a", 7), ("b", 3)]
Run Code Online (Sandbox Code Playgroud)
你从一系列元组开始.
从Swift文档:
元组类型是以逗号分隔的类型列表,括在括号中.
和:
元组将多个值分组为单个复合值.元组中的值可以是任何类型.
在这种情况下,元组是2个值的"耦合",一个是String类型,另一个是Int类型.
let res = wordFreqs.filter(
{
(e) -> Bool in
Run Code Online (Sandbox Code Playgroud)
这部分在数组上应用了一个过滤器.你可以在这里看到过滤器的闭包需要一个元素e(所以,在我们的例子中,是一个元组),然后返回一个Bool.使用'filter'函数,返回true表示保留值,而返回false表示将其过滤掉.
if e.1 > 3 {
return true
} else {
return false
}
Run Code Online (Sandbox Code Playgroud)
该e.1语法在索引1.所以返回的元组的值,如果索引1处的元组的值(第二个)超过3,过滤器返回true(因此该元组将被保留); 如果不是,则过滤器返回false(因此从结果中排除元组).此时,过滤器的结果将是[("k", 5), ("a", 7)]
}).map { $0.0 }
Run Code Online (Sandbox Code Playgroud)
map函数基于元组数组创建一个新数组:对于输入数组的每个元素($ 0),它返回索引0处的元组值.所以新数组是 ["k", "a"]
print(res)
Run Code Online (Sandbox Code Playgroud)
这会将结果打印到控制台.
这些函数(滤波器,映射,缩减等)在函数式编程中非常常见.它们通常使用点语法链接,例如,[1, 2, 3].filter({ }).map({ }).reduce({ })
// this creates an array of tuples
let wordFreqs = [("k", 5), ("a", 7), ("b", 3)]
let res = wordFreqs.filter {
(e) -> Bool in
// this filters the array
// it removes any items that have the second part of the tuple
// of 3 or less
if e.1 > 3 {
return true
} else {
return false
}
}.map {
// this "maps" the array and returns the first part of the tuple
$0.0
}
print(res)
Run Code Online (Sandbox Code Playgroud)
注意......如果我写这篇文章,我会把它缩短为......
let res = wordFreqs.filter { $0.1 > 3 }
.map { $0.0 }
Run Code Online (Sandbox Code Playgroud)