В закрытии создайте NSRange
из Range<String.Index>
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:
всегда возвращает диапазон первого совпадения.
Это устраняет проблему, он разрезает строку, перемещая начальный индекс в позицию после последнее совпадение
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 в любом случае Регулярное выражение, как в Ответ Мартина намного эффективнее.