Swift中(String, Int)格式for循环用法及类型差异咨询
Swift字典遍历for循环详解
问题背景
在《Swift编程语言(Swift 5.7)》中看到如下代码,对第7行for (_, numbers) in interestingNumbers这种格式的for循环有疑问:把代码里的_换成其他名称后,这个名称在输出里没用到,想搞懂这类for循环怎么用,以及和其他for循环的区别。
对应的代码:
let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25], ] var largest = 0 for (_, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } } } print(largest)
一、这类for循环的本质:字典的键值对遍历
你看到的写法是Swift里遍历字典键值对的标准方式:
- 字典里的每个元素都是
(键, 值)形式的元组,这里interestingNumbers的键是String(比如"Prime"),值是[Int]类型的数组,所以每个元组就是(String, [Int])。 - 这里的
_是Swift的通配符,意思是“我不需要这个值”——因为这段代码只需要字典里的数字数组(值部分),不需要对应的分类名称(键部分),用_可以忽略键,还能避免编译器报错“变量未使用”。
二、具体使用方法
- 同时用键和值:如果需要用到键,把
_换成具体变量名就行,比如:
for (category, numbers) in interestingNumbers { print("分类:\(category),包含的数字:\(numbers)") }
- 忽略其中一部分:
- 不需要键就用
_替代键的变量名,就像示例那样; - 要是只需要键不需要值,就写成
for (category, _) in interestingNumbers;
- 不需要键就用
- 单独遍历键或值:也可以直接用字典的
keys或values属性,更直观:
// 只遍历所有分类名称(键) for category in interestingNumbers.keys { print(category) } // 只遍历所有数字数组(值) for numbers in interestingNumbers.values { print(numbers) }
三、和其他for循环的差异
Swift常用的for循环主要有三种,和这种字典遍历的区别如下:
- 普通数组/序列遍历:
- 格式:
for element in 序列 - 针对数组、字符串这类线性序列,直接取出每个元素,不用处理元组。
- 例子:
let primes = [2, 3, 5, 7] for prime in primes { print(prime) } - 格式:
- 带索引的遍历(
enumerated()):- 格式:
for (index, element) in 序列.enumerated() - 用于需要同时获取元素位置和元素值的场景,返回的是
(索引, 元素)元组——这里的第一个元素是整数索引,而字典遍历的第一个元素是自定义类型的键,这是核心区别。 - 例子:
let fruits = ["apple", "banana"] for (index, fruit) in fruits.enumerated() { print("第\(index+1)个水果:\(fruit)") } - 格式:
- 字典键值对遍历:
- 格式:
for (key, value) in 字典 - 专门针对字典类型,取出的是键值对元组;可以用通配符忽略键或值,这是它独有的特性,另外字典遍历的顺序是不确定的(Swift 3.0+后字典无序,除非用
OrderedDictionary),而数组遍历是按顺序来的。
- 格式:
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

