Swift 2.0: NSRangeException,范围或索引越界

Swift 2.0: NSRangeException, Range or index out of bounds

背景:我来自 JavaScript、Ruby 和(现代)PHP 的 15-20 岁。去年我一直在研究 Swift,现在我是 brand-new 到 Cocoa。

这是我在 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)

两条调试线显示:

11
(0,10)

之后,应用程序崩溃并显示以下消息:

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'

我查看了以下文档,但没有任何内容跳到我面前:

我只能认为问题与将 NSRange 实例作为参数传递给 stringByReplacingMatchesInString() 方法有关,但我已尝试将值调整为 NSRange(0,1)NSRange(1,2) 期待看到 一些有用的东西 ,但它仍然抛出异常。

正如我在标题中所写,我在 Swift 2.0.

工作

我看到 stringByReplacingMatchesInString 的第一个参数是 'replacement'。这应该是 'self' 吗?

看了@Ben的回答,我觉得自己傻了。那开始了更多的探索,我想通了。这是代码。

#! /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 {

        let regex = try! NSRegularExpression(
            pattern: pattern,
            options: [.CaseInsensitive]
        )

        return regex.stringByReplacingMatchesInString(
            self,
            options: [.WithTransparentBounds],
            range: NSMakeRange(0, self.characters.count),
            withTemplate: replacement
        )
    }
}

let prefix = "abc     123".replace("(\s+)", replacement: " ")

print(prefix)

也许:

   Return regex.stringByReplacingMatchesInString{
        MainstringYouWantToReplaceSomethinIn,
        options: [.Anchored],
        range: NSMakeRange(0,self.MainstringYouWantToReplaceSomethinIn.count - 1),
        withTemplate: "xx"
    )
}
}