lineRange(for:)
(по существу) ожидает диапазон String.Index
, а не диапазон целых чисел.Вот простой пример:
let string = "Line1\nLine2"
// Find the full range of the line containing the first "1":
if let range = string.range(of: "1") {
let lineRange = string.lineRange(for: range)
print(string[lineRange]) // Line1
}
Фактический параметр является универсальным параметром типа R : RangeExpression, R.Bound == String.Index
, что означает, что вы также можете передать частичные диапазоны , такие как string.startIndex...
или ..<string.endIndex
.
Swift-версия образца кода Objective C
NSString *string;
unsigned numberOfLines, index, stringLength = [string length];
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
index = NSMaxRange([string lineRangeForRange:NSMakeRange(index, 0)]);
будет
let string = "Line1\nLine2"
var index = string.startIndex
var numberOfLines = 0
while index != string.endIndex {
let range = string.lineRange(for: index..<index)
numberOfLines += 1
index = range.upperBound
}
print(numberOfLines)
Здесь index..<index
принимаетроль NSMakeRange(index, 0)
.
Если цель состоит в том, чтобы просто посчитать (или перечислить) общее количество строк, то альтернативой является использование
string.enumerateLines(invoking: { (line, _) in
// ...
})
вместо этого (сравните Какразбить строку по новым строкам в Swift ).