Swift advancedBy无法处理换行符“\ r \ n”

时间:2015-10-23 10:06:28

标签: ios string swift newline swift2

今天我遇到了一个非常奇怪的问题,使用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会这样做,以及我如何解决这个问题?

1 个答案:

答案 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