Получение ошибки с NSStringEnumerationOptions.ByWords — Swift 4.2

Я пытаюсь добавить этот 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:')

Я следую подсказке «Исправить», и она меняет строку на эту:

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

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

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

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


person Community    schedule 10.03.2019    source источник


Ответы (1)


Синтаксис перечисления подстрок в методе диапазона немного изменился со времен Swift3:

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

func enumerateSubstrings(in range: R, options opts: 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, чтобы также поддерживать Substrings. Вы можете проверить, как это реализовать, в ответе, который я разместил здесь

person Leo Dabus    schedule 10.03.2019
comment
Знаете ли вы, есть ли встроенная функция Swift для определения того, содержит ли String английское слово? - person ; 10.03.2019
comment
Нет, нет. Но вы можете проверить, является ли это слово английским или нет. - person Leo Dabus; 10.03.2019
comment
Можете ли вы указать мне алгоритм Swift, который может определить, является ли String английским словом? - person ; 10.03.2019
comment
Поскольку вы, очевидно, знаете свой код. Я должен задать еще один вопрос... Что, если у меня есть Set из Strings, и я хочу перебрать Set, чтобы определить Strings, которые являются английскими словами? Причина, по которой я пытаюсь это сделать, заключается в том, что я пытаюсь решить вопрос алгоритма телефонных слов. Для ответа на этот вопрос требуется алгоритм, который идентифицирует все возможные английские слова, которым можно сопоставить данный номер телефона. У меня он в основном полный. Теперь мне просто нужно иметь возможность перебрать Set отображаемых Strings и правильно идентифицировать любые английские слова. - person ; 10.03.2019