Немного предыстории:
В Swift 3 были введены дополнительные типы диапазонов, всего четыре (см., Например, Оле Бегеманн: Диапазоны в Swift 3):
Range, ClosedRange, CountableRange, CountableClosedRange
С реализацией условных соответствий SE-0143 в Swift 4.2 «счетные» варианты больше не являются отдельными типами, а являются (ограниченными) псевдонимами типов, например
public typealias CountableRange<Bound: Strideable> = Range<Bound>
where Bound.Stride : SignedInteger
и, как следствие, были удалены различные преобразования между разными типами диапазонов, такие как
init(_ other: Range<Range.Bound>)
инициализатор struct Range
. Все изменения тезисов являются частью [stdlib] [WIP] Eliminate (Closed) CountableRange (условное соответствие) 13342) совершить.
Вот почему
let range: Range<Index> = Range<Index>(start..<self.endIndex)
больше не компилируется.
Как исправить
Как вы уже выяснили, это можно просто исправить как
let range: Range<Index> = start..<self.endIndex
или просто
let range = start..<self.endIndex
без аннотации типа.
Другой вариант - использовать односторонний диапазон (введенный в Swift 4 с помощью Односторонние диапазоны SE-0172):
extension String {
func index(of aString: String, startingFrom position: Int = 0) -> String.Index? {
let start = index(startIndex, offsetBy: position)
return self[start...].range(of: aString, options: .literal)?.lowerBound
}
}
Это работает, потому что подстрока self[start...]
имеет общие индексы с исходной строкой self
.
person
Martin R
schedule
06.06.2018