您应该知道\n 不是用于分割新行的唯一字符。例如,如果文件保存在 Windows 中,则换行符将为 \r\n。阅读the Newline article in Wikipedia 了解更多信息。
因此,如果你只使用componentsSeparatedByString("\n"),你可能会得到意想不到的结果。
let multiLineString = "Line 1\r\nLine 2\r\nLine 3\r\n"
let lineArray = multiLineStringRN.componentsSeparatedByString("\n")
// ["Line 1\r", "Line 2\r", "Line 3\r", ""]
注意剩余的\r 和空数组元素。
有几种方法可以避免这些问题。
解决方案
1. componentsSeparatedByCharactersInSet
let multiLineString = "Line 1\nLine 2\r\nLine 3\n"
let newlineChars = NSCharacterSet.newlineCharacterSet()
let lineArray = multiLineString.componentsSeparatedByCharactersInSet(newlineChars).filter{!$0.isEmpty}
// "[Line 1, Line 2, Line 3]"
如果未使用filter,则\r\n 将生成一个空数组元素,因为它被计为两个字符,因此在同一位置将字符串分隔两次。
2。 split
let multiLineString = "Line 1\nLine 2\r\nLine 3\n"
let newlineChars = NSCharacterSet.newlineCharacterSet()
let lineArray = multiLineString.utf16.split { newlineChars.characterIsMember($0) }.flatMap(String.init)
// "[Line 1, Line 2, Line 3]"
或
let multiLineString = "Line 1\nLine 2\r\nLine 3\n"
let lineArray = multiLineString.characters.split { $0 == "\n" || $0 == "\r\n" }.map(String.init)
// "[Line 1, Line 2, Line 3]"
这里 \r\n 被视为单个 Swift 字符(扩展的字素簇)
3. enumerateLines
let multiLineString = "Line 1\nLine 2\r\nLine 3\n"
var lineArray = [String]()
multiLineString.enumerateLines { (line, stop) -> () in
lineArray.append(line)
}
// "[Line 1, Line 2, Line 3]"
有关enumerateLine 语法的更多信息,另请参阅this answer。
注意事项: