试着掌握Swift编程,我写了以下内容:
var s : String = "dog"
var i1 : String.Index = advance(s.startIndex, 2)
var t1 : String = s.substringToIndex(i1)
在游乐场中执行此代码,t1
具有值"do"
,如预期的那样。但是,如果我尝试构造一个超过字符串长度的索引,就会发生这种情况:
var s : String = "dog"
var i2 : String.Index = advance(s.startIndex, 4)
var t2 : String = s.substringToIndex(i2)
这一次,var i2 ...
行显示错误
执行被中断,原因是:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)。
我阅读了Swift文档,但String.substringToIndex
的条目完整读取:
func substringToIndex(index: String.Index) -> String
[基础]返回一个新字符串,其中包含String的字符,但不包括给定索引处的字符串。
结果不是可选的,函数也不具有错误参数,或者在参数错误的情况下返回空字符串。
我不知道如何通过不首先创建索引来防止这种情况,因为String
没有length
或count
属性。
由于Swift没有异常处理,程序如何从这样的错误中恢复?
这是在OS X 10.10.2,Xcode 6.2上。
答案 0 :(得分:0)
错误在advance(s.startIndex, 4)
,因为您无法超越结束索引:
1> var s = "dog"
s: String = "dog"
2> var i1 = advance(s.startIndex, 4)
fatal error: can not increment endIndex
i1: String.Index = {
_base = { /* ... */ }
/* ... */
}
Execution interrupted. Enter Swift code to recover and continue.
Enter LLDB commands to investigate (type :help for assistance.)
通过提供结束索引来避免这种情况:
3> var i1 = advance(s.startIndex, 4, s.endIndex)
i1: String.Index = {
_base = { /* ... */ }
/* ... */
}
然后:
4> s.substringToIndex(i1)
$R0: String = "dog"
至少对于Swift1.2,在Xcode6-Beta3中。