为什么我的可选值没有打开,Swift?

时间:2014-09-13 13:59:01

标签: swift

我有一个非常简单的例子,并且不知道为什么它不能按预期工作。

var list:Array<Int> = [1,2,3,4,5]

var item:Int?


for var index = 0; index < list.count; index++ {

   item! = list[index]

   item = item + 5 // <-- error value of optional type 'Int?' not unwrapped
}

为什么斯威夫特强迫我写作:item = item! + 5

我在这里打开它:item! = list[index]如果列表返回nil - 将抛出异常。

据我了解此步骤a.e。:item! = list[index] item不是nil

我尝试了几个选项:

  • item! = list[index] as Int!
  • item! = list[index] as AnyOblect! as? Int

但是仍然需要写item = item! + 5

我使用了游乐场

1 个答案:

答案 0 :(得分:3)

让我为你分解一下:

  • var item:Int?告诉编译器,无论何时使用单词item,它都会引用可选 Int类型的变量(aka {{ 1}})。

  • 另一方面,
  • Int?告诉编译器,无论何时使用单词var item:Int,它都会引用类型为item的变量。

    < / LI>
  • 要访问Int中声明的变量的展开值,您始终必须使用var item:Int?。编译器不会猜测变量item!是否具有值。毕竟,这是期权的整个目的。要明确这些变量可能有也可能没有值

  • 基本上,我想说的是一个变量一旦被声明为可选,总是是一个可选项,无论它是否包含值。要获得展开的值,您将始终必须使用字符item,除非您决定将其值存储在另一个变量中(例如!

要摆脱错误,只需将var unwrappedItem = item!变量声明为item类型,而不是Int

至于为什么Swift抛出错误而不是让运行时引发异常,这只是一个额外的预防措施,可能会阻止人们使用不良做法。