今天我遇到了一个非常奇怪的问题,使用Swift 2。
我有这个简单的方法来提取基于NSRange的子字符串:
func substringWithRange(string: String, range: NSRange) -> String {
let startIndex = string.startIndex.advancedBy(range.location)
let endIndex = startIndex.advancedBy(range.length)
let substringRange = Range<String.Index>(start: startIndex, end: endIndex)
return string.substringWithRange(substringRange)
}
对于包含unicode字符的普通字符串或字符串,一切正常。但是一个字符串包含换行符“\ r \ n”并突然
let startIndex = string.startIndex.advancedBy(range.location)
总是比它应该大1。
let string = "<html>\r\n var info={};</html>"
let range = NSMakeRange(9, 12)
let substring = substringWithRange(string, range: range)
//Expected: var info={};
//Actual: ar info={};<
//string.startIndex = 0
//range.location = 9
//startIndex after advancedBy = 10
有谁知道为什么advancedBy会这样做,以及我如何解决这个问题?
答案 0 :(得分:11)
原因是Swift将\r\n
视为一个字符
let cr = "\r"
cr.characters.count // 1
let lf = "\n"
lf.characters.count // 1
let crlf = "\r\n"
crlf.characters.count // 1