我试图在字符串中找到子字符串匹配,并获取匹配的位置。
我无法弄清楚以下代码有什么问题:
let str1 = "hello#゚Д゚"
let cmp = "゚Д゚"
let searchRange = Range(start: str1.startIndex, end: str1.endIndex)
let range = str1.rangeOfString(cmp, options: .allZeros, range: searchRange)
println("\(searchRange), \(range!)") // output: 0..<9, 6..<9
let dis = distance(searchRange.startIndex, range!.startIndex) // fatal error: can not increment endIndex! reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
// let dis = distance(searchRange.startIndex, range!.endIndex) // This will go and output: distance=7
println("distance=\(dis)")
正如评论所建议的,尽管range
具有有效值,distance() 方法抛出致命错误。
如果我对 distance() 的使用有误,我应该使用什么方法来归档目标?
任何意见将是有益的。谢谢。
range!.startIndex
这里要点:
"hello#゚Д゚"
^
但是,在这种情况下,#゚
是 Swift 中的单个字符。
因此,这段代码:
for var idx = searchRange.startIndex; idx != range!.startIndex; idx = idx.successor() {
println("\(idx): \(str1[idx])");
}
prints:
0: h
1: e
2: l
3: l
4: o
5: #゚
7: Д゚
fatal error: Can't form a Character from an empty String
// and emits BAD_INSTRUCTION exception
如你看到的range!.startIndex
永远不会匹配字符边界,并且for
循环运行字符串。这就是您看到异常的原因。
理论上,自从String
被视为“集合Character
s" 在 Swift 中,"゚Д゚"
不应该是子串"hello#゚Д゚"
.
I think .rangeOfString()
uses NSString
将字符串视为序列的实现unichar
。我不知道这是否应该被视为一个错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)