[swift-evolution] (Draft) Add last(where:) and lastIndex(where:) methods

Brent Royal-Gordon brent at architechies.com
Thu May 19 20:19:25 CDT 2016

> Why shouldn't this work with all Collections, with an optimized version
> for BidirectionalCollections?

Why don't we have `index(before:)` on non-BidirectionalCollections? It's not that you can't write it:

	func index(before index: Index) -> Index {
		let offset = distance(from: startIndex, to: index)
		return index(startIndex, offsetBy: offset - 1)

We don't do that because it would be so slow as to form an attractive nuisance. Similarly, we shouldn't provide operations which are going to repeatedly seek elements near the tail of the list unless we're using a type which can access that tail efficiently. `last` is one thing—it's only O(N). `lastIndex(of:)` is, I believe, O(n log n) in the case of an element that doesn't exist.

> I think we need to consider consistency of naming more carefully in this
> area.  If we go this route, I want:
>  x.firstIndex(of: 10)

I think that's actually great, because it will separate the user-facing `index(of:)` and `index(where:)` from the stdlib-facing `index(after:)`, `index(before:)`, `index(_:offsetBy:)`, etc.

Brent Royal-Gordon

More information about the swift-evolution mailing list