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
)表示s
second(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)