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'
我查看了以下文档,但没有任何内容跳到我面前:
- NSRegularExpression Class Reference
- NSRegularExpression/enumerateMatchesInString:options:range:usingBlock:
我只能认为问题与将 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"
)
}
}
背景:我来自 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'
我查看了以下文档,但没有任何内容跳到我面前:
- NSRegularExpression Class Reference
- NSRegularExpression/enumerateMatchesInString:options:range:usingBlock:
我只能认为问题与将 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"
)
}
}