Получение ошибки с NSStringEnumerationOptions.ByWords - Swift 4.2 - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь добавить это Extension в мой код, чтобы перечислить подстроки по словам.Источник этого кода датирован 2015 годом, так что это, по-видимому, более ранняя версия Swift.Я использую Swift4.2 и не могу понять, как правильно обновить код в строке, указанной ниже, с примечанием.

extension String {
    func words() -> [String] {

        let range = Range<String.Index>(start: self.startIndex, end: self.endIndex) // THIS LINE CAUSES ERROR
        var words = [String]()

        self.enumerateSubstringsInRange(range, options: NSStringEnumerationOptions.ByWords) { (substring, _, _, _) -> () in
            words.append(substring)
        }

        return words
    }
}

Сначала я получаю эту ошибку: Неправильные метки аргумента в вызове (имеют 'start: end:', ожидаемый '_: in:')

Я следую подсказке "Fix", и она меняет строку на эту:

let range = Range<String.Index>(self.startIndex, in: self.endIndex)

Затем я получаю эту ошибку без предложения исправления:

Невозможно преобразовать значение типа 'String.Index' в ожидаемый аргументвведите 'NSRange' (он же '_NSRange')

Возможно, ошибки связаны с обновлением версии Swift, и я не могу найти правильный способ написания этой строки.

1 Ответ

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

Перечислимые подстроки в синтаксисе метода диапазона немного изменились после Swift3:

Новая декларация:

func enumerateSubstrings (в диапазоне: R, опции доступны: String.EnumerationOptions = default, _ body: @escaping (String ?, Range, Range, inout Bool) -> Void) где R : RangeExpression, R.Bound == String.Index

extension String {
    func words() -> [String] {
        var words = [String]()
        enumerateSubstrings(in: startIndex..., options: .byWords) { substring, _, _, _ in
            words.append(substring!)
        }
        return words
    }
}

"abc def".words()  //  ["abc", "def"]

Обратите внимание, что в Swift 4 или более поздней версии вы должны расширять StringProtocol вместо самого типа String для поддержки Substring s. Вы можете проверить, как это осуществить, в ответе, который я выложил здесь

...