[swift-evolution] Pitch: String Index Overhaul

Dave Abrahams dabrahams at apple.com
Sat Jun 3 19:10:00 CDT 2017


on Sat Jun 03 2017, Ben Rimmington <me-AT-benrimmington.com> wrote:

>> On 27 May 2017, at 18:40, Dave Abrahams wrote:
>> 
>> ## Introduction
>> 
>> Today `String` shares an `Index` type with its `CharacterView` but not
>> with its `UTF8View`, `UTF16View`, or `UnicodeScalarView`.  This
>> proposal redefines `String.UTF8View.Index`, `String.UTF16View.Index`,
>> and `String.CharacterView.Index` as typealiases for `String.Index`,
>> and exposes a public `encodedOffset` property and initializer that can
>> be used to serialize and deserialize positions in a `String` or
>> `Substring`.
>
> If `encodedOffset` is only needed for serialization of indices, 

It's not only needed for that.  Once StringProtocol provides access to
its underlying code units, the encodedOffset will be useful information
in other ways.

> could `String.Index` conform to `Codable` from SE-0166 instead?

Not instead, definitely.  Additionally, maybe; that's a separate
proposal.

>> ## Proposed solution
>> 
>> All `String` views will use a single index type (`String.Index`), so
>> that positions can be interchanged without awkward explicit
>> conversions:
>> 
>> ```swift
>> let html: String = "See <a href=\"http://swift.org\">swift.org</a>"
>> 
>> // Search the UTF16, instead of characters, for performance reasons:
>> let open = "<".utf16.first!, close = ">".utf16.first!
>> let tagStart = s.utf16.index(of: open)
>> let tagEnd = s.utf16[tagStart...].index(of: close)
>
> I think `s` should be `html` in the previous two lines.

Ah, yeah, thanks; good catch!

-- 
-Dave


More information about the swift-evolution mailing list