如何在序列的最后一次出现时拆分字符串

pro*_*cra 3 string split swift

目标:带有内置分隔符的字符串应拆分为一个 int 和另一个字符串。如果分隔符序列 '###' 出现多次,则字符串应始终拼接在最后一个 '###' 处。

是否有像 string.lastIndexOf("###") 这样的运算符,就像在 C# 中一样?

这是我的解析器的样子:

func parseTuple(from string: String) -> (String, Int)? {
    let parsedString = string.components(separatedBy: "###")
    if let tupleString = String(parsedString[0]), let tupleInt = Int(parsedString[1]) {
        return (tupleString, tupleInt)
    } else {
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 6

range(of:...)方法String有一个.backwards选项来查找字符串的最后一次出现。然后substring(to:)andsubstring(from:)可以与该范围的下限/上限一起使用以提取分隔符之前/之后的字符串部分:

func parseTuple(from string: String) -> (String, Int)? {

    if let theRange = string.range(of: "###", options: .backwards),
        let i = Int(string.substring(from: theRange.upperBound)) {
        return (string.substring(to: theRange.lowerBound), i)
    } else {
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

if let tuple = parseTuple(from: "Connect###Four###Player###7") {
    print(tuple)
    // ("Connect###Four###Player", 7)
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特 4 更新:

func parseTuple(from string: String) -> (String, Int)? {

    if let theRange = string.range(of: "###", options: .backwards),
        let i = Int(string[theRange.upperBound...]) {
        return (String(string[...theRange.lowerBound]), i)
    } else {
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)