Context: I come from 15-20 years of JavaScript, Ruby and (modern) PHP. I've been poking at Swift over the last year, and I'm brand-new to Cocoa.
Here's a simplified test case that I'm running in Xcode 7.0 β2:
#! /usr/bin/env swift
import Foundation
// Extend the String object with helpers
extension String {
    // String.replace(); similar to JavaScript's String.replace() and Ruby's String.gsub()
    func replace(pattern: String, replacement: String) -> String {
        // Debugging
        print(self.characters.count)
        print(NSMakeRange(0, self.characters.count - 1))
        let regex = try! NSRegularExpression(
            pattern: pattern,
            options: [.CaseInsensitive]
        )
        return regex.stringByReplacingMatchesInString(
            replacement,
            options: [.Anchored],
            range: NSMakeRange(0, self.characters.count - 1),
            withTemplate: "xx"
        )
    }
}
let prefix = "abc     123".replace("\\s+", replacement: " ")
print(prefix)
The two debugging lines display:
11
(0,10)
After that, the app crashes with the following message:
2015-06-24 23:18:45.027 swift[42912:648900] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]: Range or index out of bounds'
I've looked over the following documentation, but nothing is jumping out to me:
- NSRegularExpression Class Reference
 - NSRegularExpression/enumerateMatchesInString:options:range:usingBlock:
 
I can only think that the issue has something to do with passing an NSRange instance as a parameter to the stringByReplacingMatchesInString() method, but I've tried adjusting the value to NSRange(0,1) and NSRange(1,2) expecting to see something that would help, but it's still throwing the exception.
As I wrote in the title, I'm working in Swift 2.0.
                        
I see that the first argument to stringByReplacingMatchesInString is 'replacement'. Should this be 'self'?