无法超越endIndex

时间:2017-01-04 15:54:09

标签: swift swift3

我正在寻找处理错误的“Swift 3”方法,我尝试将字符串的位置增加到越界索引。我的扩展名如下所示:

extension String {
  func substring(from: Int) -> String {
        let fromIndex = index(from: from)
        return substring(from: fromIndex)
  }
}

在实现代码中,我有一个循环,它定期获取字符串的块并在字符串中进一步移动索引。我的问题是我不确定Swift 3的处理方式是什么?“字符串结尾,如果我们到达终点就不要继续”

实现代码就像这样简单:

myStr = myStr.substring(from: pos + 1)

如果pos + 1是字符串的结尾,则不应该出错,而应该从我的循环中退出/返回。这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:4)

你可以写这样的东西

extension String {
    func substring(from: Int) -> String {
        let fromIndex = index(self.startIndex, offsetBy: from)
        return substring(from: fromIndex)
    }
}

实施例

"Hello world".substring(from: 0) // "Hello world"
"Hello world".substring(from: 1) // "ello world"
"Hello world".substring(from: 2) // "llo world"

如果你传递错误的参数会怎么样?

这样的事情会产生致命的错误。

"Hello world".substring(from: 12)
fatal error: cannot increment beyond endIndex

您可以使代码更安全,添加像这样的保护声明

extension String {
    func substring(from: Int) -> String? {
        guard from < self.characters.count else { return nil }
        let fromIndex = index(self.startIndex, offsetBy: from)
        return substring(from: fromIndex)
    }
}

答案 1 :(得分:3)

您可以使用index(_, offsetBy:, limitedBy:)方法 确保索引不超过最终索引:

extension String {
    func substring(from: Int) -> String? {
        guard let fromIndex = index(startIndex, offsetBy: from, limitedBy: endIndex) else {
            return nil
        }
        return substring(from: fromIndex)
    }
}

答案 2 :(得分:1)

extension String {
    func substring(from index: Int) -> String {
        guard index < characters.count else { return "" }
        return substring(from: characters.index(startIndex, offsetBy: index))
    }
}

"12345".substring(from: 3) // "45"
"12345".substring(from: 9) // ""

或者,当您将函数的返回类型更改为nil

时,如果index超出界限,您可能希望返回String?