使用枚举,zip方法并迭代索引

时间:2017-11-19 11:53:21

标签: swift

我无法理解这段代码,我想要的帮助不大。下面的例子来自swift标准库。此示例迭代集合的indiceselements,构建一个由indices个字母组成的列表,其中包含五个或更少的字母。

let names: Set = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
var shorterIndices: [SetIndex<String>] = []
for (i, name) in zip(names.indices, names) {
    if name.count <= 5 {
        shorterIndices.append(i)
    }
}

现在shorterIndices数组在名称集中保存了较短名称的indices,您可以使用indices来访问集合中的elements

for i in shorterIndices {
    print(names[i])
}
// Prints "Sofia"
// Prints "Mateo"

在第一组代码中,if语句如何能够计算五个或更少字母的名称。因为name.count5。并且shorterIndices.append(i)包含names Set的每个值。我是编程新手,我无法理解这个例子。有人可以逐行解释吗?

@vacawama检查一下:

let names: Set = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
for (i, name) in zip(names.indices, names) {
    print("\(names[i]): \(name.count)")
}
//prints
  Nicolás: 7
  Martina: 7
  Camilla: 7
  Mateo: 5
  Sofia: 5

现在检查一下

let names: Set = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
for (i, name) in zip(names, names) {
    print("\(i): \(name.count)")
}
//prints
  Nicolás: 7
  Martina: 7
  Camilla: 7
  Mateo: 5
  Sofia: 5

1 个答案:

答案 0 :(得分:1)

理解此代码的关键是了解zip的作用。它从两个单独的序列创建一系列元组对。如果您选择单击Xco​​de中的zip,则会提供以下示例:

let words = ["one", "two", "three", "four"]
let numbers = 1...4

for (word, number) in zip(words, numbers) {
    print("\(word): \(number)")
}
// Prints "one: 1"
// Prints "two: 2
// Prints "three: 3"
// Prints "four: 4"

逻辑上,zip创建一个序列,如果变成数组,则为[("one", 1), ("two", 2), ("three", 3), ("four", 4)]。然后,for (word, number)循环依次获取每个元组,并将一个单词分配给word,将一个数字分配给number。第一次循环,word"one"number1

在您的情况下,zip(names.indices, names)创建的元组对包含集合的索引和集合中的名称。 for循环一次只查看一个(index, name)对。

第一次循环时,name"Sofia"i是该集合中"Sofia"的索引。

如果"Sofia"的长度为<= 5,则其索引将添加到新数组中。在这种情况下,name.count5,因为"Sofia"5个字母,因此其索引会被添加。

集合没有排序,因此名称可能不会按照您期望的确切顺序进行迭代,但每个名称都与其正确的索引配对。将for循环更改为:

for (i, name) in zip(names.indices, names) {
    print("name = \(name)")
    print("name.count = \(name.count)")
    print("names[i] = \(names[i])")
    print("-----")
}

看看发生了什么。当我这样做时,我得到了:

name = Nicolás
name.count = 7
names[i] = Nicolás
-----
name = Martina
name.count = 7
names[i] = Martina
-----
name = Camilla
name.count = 7
names[i] = Camilla
-----
name = Mateo
name.count = 5
names[i] = Mateo
-----
name = Sofia
name.count = 5
names[i] = Sofia
-----

请注意,names[i]name不同,因为i中的索引Set与名称相对应。当此索引附加到shorterIndices数组时,稍后可以使用它从集合中检索名称。