Swift definitely eschews some traditional string manipulation patterns that we’re used to seeing both in Objective-C and other programming languages.
Say you’re not that familiar with Objective-C and you’re thinking of ways to test if a particular string starts with some other string. Maybe you’d try a regex first:
But for sure some people who have been writing Obj-C for a while will take offense to this. They’d rather do it this way:
And since we can bridge between
NSString seamlessly, maybe that’s the way you’d do it too:
Hell, that’s the way I’d do it. It’s simple and clear, it doesn’t take any cleverness to figure out what’s going on. But - just for the exercise - we’re preparing for a day where
NSString doesn’t exist anymore. How can we be most Swifty?
Ranges are a particularly confusing part of strings in Swift so at least this exercise will give us some insight into how they work. Firstly, our range from
rangeOfString returns an optional (nil if it doesn’t appear in the string). Now (as of Swift 1.2) that we can make more complex
if let statements, we can even check if the beginning of the range is the start of the original string, all in one line.
OK, so now that you’ve identified that a string starts with some substring, maybe you want to get the rest of that string?
Objective-C users will again cry foul: “We already have a way to do this!” And they’re right. Using
substringFromIndex and counterparts is an easy way to get this done in Objective-C.
But what’s this?
substringFromIndex in Swift no longer takes and integer but a
Lucky for us, we have a working knowledge of
String.Index from our range exercise earlier and we know we can easily coax one out of our starting string with
But we’re using
substringFromIndex which means we want to get a substring starting at some index after the start, so we need to get an index later down the string. Enter your new friend
advance which will “advance” the string index by an integer amount of steps. Get used to this guy, he comes up a lot with ranges.
Finally we can use our familiar
substringFromIndex method in Swift. The whole thing spelled out for you: