Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用枚举、zip方法并迭代索引_Swift - Fatal编程技术网

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

Swift 使用枚举、zip方法并迭代索引,swift,Swift,我无法理解此代码,我不需要什么帮助。下面的示例来自swift标准库。本例迭代集合的索引和元素,构建一个由五个或更少字母的名称索引组成的列表 let names: Set = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"] var shorterIndices: [SetIndex<String>] = [] for (i, name) in zip(names.indices, names) { if name.coun

我无法理解此代码,我不需要什么帮助。下面的示例来自swift标准库。本例迭代集合的索引和元素,构建一个由五个或更少字母的名称索引组成的列表

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)
    }
}
在第一组代码中,if语句如何能够计算五个或更少字母的名称。因为name.count是5。和shorterIndices.appendi包括名称集的每个值。我是编程新手,我不能理解这个例子。有人能逐行解释一下吗

@瓦卡瓦马,看看这个:

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

理解这段代码的关键是理解zip的功能。它从两个单独的序列创建元组对序列。如果您选择在Xcode中单击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创建了一个序列,如果将其转换为一个数组,它将是[1,1,2,2,3,3,4]。然后for-word,number循环依次获取每个元组,并为单词分配一个单词,为数字分配一个数字。第一次通过循环时,单词是1,数字是1

在您的例子中,由zipnames.index创建的元组对中,名称包含集合中的索引和集合中的名称。for循环每次查看一个索引、名称对

第一次通过循环时,名称是Sofia,i是集合中Sofia的索引

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

如果索菲亚的长度是,你就把名字和名字弄混了names是一个数组,names.count=5。name是一个字符串,name.count是该字符串的长度。@Martin for i,name in zipnames.index,names这行代码使用zip方法将name.index序列分配给i,并将name序列分配给name,对吗?所以我认为name.count和name.count是相等的。那么什么是正确的呢?将printname添加到for循环中,您将立即看到它。什么是SetIndex?@Alexander滚动到底部。瓦卡瓦马回答了你的问题。检查最后一个中的第三个。否,for循环正在对序列进行迭代。每次通过for循环只能得到一对。第一次通过时,我包含Sofia的索引,名称为Sofia。第二次通过循环时,变量名为Camilla,name.count为7,因为Camilla有7个字母,所以索引不会添加到数组中。集合没有顺序,因此名称可能不会按您期望的确切顺序迭代,但每个名称都与其正确的索引配对。将for循环更改为for i,name in zipnames.index,names{printname=\name printname.count=\name.count}以查看发生了什么。如果不需要索引,只需循环遍历值本身。这种情况经常发生。在C等语言中,您必须使用索引来访问项目。在Swift中,您可以直接迭代项目。我想使用索引的原因是,如果您存储它们,它们可能会比项目本身占用更少的空间,因此您不会获得第二个副本。但这似乎也很危险,因为如果将项目添加到集合中,索引可能会改变。Big Nerd Ranch的书也很受尊重,但我认为他们的Swift书仍然是Swift 3.0。
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
-----