我正在寻找处理错误的“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
是字符串的结尾,则不应该出错,而应该从我的循环中退出/返回。这样做的最佳方式是什么?
答案 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?