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