将 slice from string to string 函数修改为 return last index if to string not found

Modify slice from string to string function to return last index if to string not found

我有一个切片函数 。我想知道如何修改它,以便如果找不到 to 字符串,但找到 from 它将 return 整个字符串的结束索引(.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])
            }
        }
    }
}

这是一种可能的解决方案:

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
        }
    }
}

它不像原来的那样"fancy",但我个人认为逻辑更容易阅读。