Swift非可选值函数中的错误处理

时间:2015-03-28 16:01:30

标签: string swift error-handling

试着掌握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没有lengthcount属性。 由于Swift没有异常处理,程序如何从这样的错误中恢复?

这是在OS X 10.10.2,Xcode 6.2上。

1 个答案:

答案 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中。