@@ -70,19 +70,19 @@ and a `continue` statement and is discussed in <doc:Statements#Break-Statement>
70
70
A ` for ` -` in ` statement allows a block of code to be executed
71
71
once for each item in a collection (or any type)
72
72
that conforms to the
73
- [ ` Sequence ` ] ( https://developer.apple.com/documentation/swift/sequence ) protocol.
73
+ [ ` Sequence ` ] ( https://developer.apple.com/documentation/swift/sequence ) protocol, or in a value parameter pack .
74
74
75
75
A ` for ` -` in ` statement has the following form:
76
76
77
77
``` swift
78
- for < #item #> in < #collection #> {
78
+ for < #item #> in < #expression #> {
79
79
< #statements #>
80
80
}
81
81
```
82
82
83
- The ` makeIterator() ` method is called on the * collection * expression
84
- to obtain a value of an iterator type --- that is,
85
- a type that conforms to the
83
+ If the * expression * of a ` for ` - ` in ` statement is a collection * expression * , the
84
+ ` makeIterator() ` method is called on it to obtain a value of an iterator type
85
+ --- that is, a type that conforms to the
86
86
[ ` IteratorProtocol ` ] ( https://developer.apple.com/documentation/swift/iteratorprotocol ) protocol.
87
87
The program begins executing a loop
88
88
by calling the ` next() ` method on the iterator.
@@ -93,6 +93,16 @@ and then continues execution at the beginning of the loop.
93
93
Otherwise, the program doesn't perform assignment or execute the * statements* ,
94
94
and it's finished executing the ` for ` -` in ` statement.
95
95
96
+ The * expression* of a ` for ` -` in ` statement may also be a pack expansion
97
+ * expression* . In this case, on the * i* th iteration, the type of * item* is the
98
+ * i* th type parameter in the type parameter pack being iterated over. The value
99
+ of * item* is the pattern type of * expression* , with each captured type
100
+ parameter pack replaced with an implicit scalar type parameter with matching
101
+ requirements. The * expression* is evaluated once at each iteration, instead of
102
+ ` n ` times eagerly, where ` n ` is the length of the packs captured by the
103
+ pattern. The program will continue executing * statements* while the total
104
+ length of the packs captured by the pattern isn't reached.
105
+
96
106
> Grammar of a for-in statement:
97
107
>
98
108
> * for-in-statement* → ** ` for ` ** ** ` case ` ** _ ?_ * pattern* ** ` in ` ** * expression* * where-clause* _ ?_ * code-block*
0 commit comments