Измените функцию от строки до строки, чтобы она возвращала последний индекс, если строка не найдена - PullRequest
0 голосов
/ 15 мая 2018

У меня есть функция среза, которую я получил здесь . Мне было интересно, как я могу изменить его так, чтобы, если строка to не была найдена, но она нашла from, она возвращала бы конечный индекс всей строки (.count-1). Сейчас, очевидно, происходит сбой, если я звоню .slice, а строка to не найдена.

extension String {

    func slice(from: String, to: String) -> String? {

        return (range(of: from)?.upperBound).flatMap { substringFrom in
            (range(of: to, range: substringFrom..<endIndex)?.lowerBound).map { substringTo in
                String(self[substringFrom..<substringTo])
            }
        }
    }
}

1 Ответ

0 голосов
/ 15 мая 2018

Вот одно из возможных решений:

extension String {
    func slice(from: String, to: String) -> String? {
        if let fromRng = range(of: from) {
            if let toRng = range(of: to, range: fromRng.upperBound..<endIndex) {
                // "from" and "to" found, get parts between
                return String(self[fromRng.upperBound..<toRng.lowerBound])
            } else {
                // "to" not found, return everything after "from"
                return String(self[fromRng.upperBound...])
            }
        } else {
            // "from" not found
            return nil
        }
    }
}

Это не так "причудливо", как оригинал, но лично я думаю, что логику гораздо легче читать.

...