Невозможно вызвать инициализатор для типа Range'со списком аргументов типа' (Range)» - PullRequest
0 голосов
/ 06 июня 2018

После обновления до бета-версии Xcode 10, которая, по-видимому, поставляется с Swift 4.1.50, я вижу следующую ошибку, которую я не знаю, как исправить:

Невозможно вызвать инициализатор для типа'Range ' со списком аргументов типа '(Range )'

в следующей функции на Range<Index>(start..<self.endIndex) (строка 3):

func index(of aString: String, startingFrom position: Int? = 0) -> String.Index? {
    let start: String.Index = self.index(self.startIndex, offsetBy: position!)
    let range: Range<Index> = Range<Index>(start..<self.endIndex)
    return self.range(of: aString, options: .literal, range: range, locale: nil)?.lowerBound
}

Есть идеи, как починить инициализатор?

Ответы [ 4 ]

0 голосов
/ 28 марта 2019

Я перешел с xcode 9.2 на xcode 10.1, а затем начал сталкиваться с этой ошибкой и разрешил ее таким образом

let range = start...end

0 голосов
/ 06 июня 2018

Немного предыстории:

В Swift 3 были введены дополнительные типы диапазонов, что в сумме составило четыре (см., Например, Ole Begemann: Диапазоны в 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] Elifyate (Closed) CountableRange с использованием условного соответствия (# 13342) commit.

Так вот почему

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.

0 голосов
/ 09 октября 2018

У меня была та же проблема, Вы можете использовать этот код для решения проблемы -

let range = startIndex ..

Ссылка: https://github.com/Ahmed-Ali/JSONExport/issues/121

0 голосов
/ 06 июня 2018

Оказывается, диапазоны не нужно инициализировать, а можно просто создать следующим образом:

let range: Range<Index> = start...end

В этом случае код будет исправлен путем замены Range<Index>(start..<self.endIndex) на:

let range: Range<Index> = start..<self.endIndex
...