我有一个非常简单的例子,并且不知道为什么它不能按预期工作。
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
我使用了游乐场
答案 0 :(得分:3)
让我为你分解一下:
var item:Int?
告诉编译器,无论何时使用单词item
,它都会引用可选 Int
类型的变量(aka {{ 1}})。
Int?
告诉编译器,无论何时使用单词var item:Int
,它都会引用类型为item
的变量。
要访问Int
中声明的变量的展开值,您始终必须使用var item:Int?
。编译器不会猜测变量item!
是否具有值。毕竟,这是期权的整个目的。要明确这些变量可能有也可能没有值。
基本上,我想说的是一个变量一旦被声明为可选,总是是一个可选项,无论它是否包含值。要获得展开的值,您将始终必须使用字符item
,除非您决定将其值存储在另一个变量中(例如!
)
要摆脱错误,只需将var unwrappedItem = item!
变量声明为item
类型,而不是Int
。
至于为什么Swift抛出错误而不是让运行时引发异常,这只是一个额外的预防措施,可能会阻止人们使用不良做法。