在闭包中从Range<String.Index> 创建一个NSRange
let string = "hello\nhello"
let rangesSplittedByLines: [NSRange] = string.split(separator: "\n").map {
return NSRange(string.range(of: $0)!, in: string)
}
但是还有另一个问题。代码返回 [{0, 5}, {0, 5}],因为 range(of: 总是返回 first 匹配的范围。
这解决了问题,它通过将起始索引移动到最近匹配后的位置来分割字符串
let string = "hello\nhello"
var startIndex = string.startIndex
let rangesSplittedByLines: [NSRange] = string.split(separator: "\n").map {
let subString = string[startIndex...]
let swiftRange = subString.range(of: $0)!
let nsRange = NSRange(swiftRange, in: string)
startIndex = swiftRange.upperBound
return nsRange
}
而且没有理由明确地将String 桥接到NSString。
但无论如何,nsranges 就像 Martin 的答案一样,正则表达式效率更高。