Avatar
struct Foo : Sequence { struct Iterator : IteratorProtocol { mutating func next() -> Int? { return nil } } func makeIterator() -> Foo.Iterator { return Iterator() } func forEach(_ body: (Int) throws -> Void) rethrows { try body(1) try body(2) try body(3) } } let a = Foo() let b = a.first(where: { $0 == 2 }) print(b) こういう場合に Iterator が使われずに forEach が呼ばれるので、Iterator のオーバーヘッドを背負う必要がなくなるということですね。