Not all stdlib iterators conform to Sequence -- many data structures provide iterators that aren't sequences: see Set.Iterator, Dictionary.Iterator, Dictionary.Values.Iterator, String.Iterator, etc. (There aren't any technical reasons these couldn't be sequences, though.) The big exception is the default Collection iterator, IndexingIterator, which does conform to Sequence.
I consider Sequence conformance on an IteratorProtocol type to be mostly a convenience feature. Its most visible effect is that it allows you to use the iterator directly in a for loop, as well as in generic contexts constrained to Sequence.
let array: Array<Int> = [1, 2, 3, 4]
let i = array.makeIterator()
for value in i { // OK; IndexingIterator is a Sequence
print(value) // ⟹ 1, 2, 3, 4
}
let set: Set<Int> = [1, 2, 3, 4]
let j = set.makeIterator()
for value in j { // error: type 'Set<Int>.Iterator' does not conform to protocol 'Sequence'
print(value)
}
This is a relatively shallow convenience feature with marginal utility. We can always use a while loop to iterate, or we can wrap the iterator in an IteratorSequence:
var j = someSequence.makeIterator()
while let value = j.next() { // OK
print(value)
}
var j = someSequence.makeIterator()
for value in IteratorSequence(j) { // OK
print(value)
}
Sequence conformance does somewhat imply to me that it is safe to save any iterator value and restart the iteration from that point, without affecting the state of the other live iterators. However, this is not an explicit requirement, and some types may violate it. (Hopefully none in the stdlib.)
let i = someSequence.makeIterator() // Start first pass over `someSequence`.
var j = i
let value1 = j.next()
var k = i.makeIterator() // Start first pass over the sequence `i`.
let value2 = k.next()
print(value1 == value2) // I expect this should print true