2014-09-13 32 views
0

我有一個非常簡單的例子,不知道爲什麼它不能按預期工作。爲什麼我的可選值沒有解開,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 - 異常將被拋出。

據我所知這一步AE:item! = list[index]itemnil

我試了幾個選項,如:

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

但仍然得到同樣的需求寫item = item! + 5

我用操場

回答

3

讓我打破它給你:

  • var item:Int?告訴每當字item使用編譯器,它指的是類型可選Int的變量(又名Int?)。

  • var item:Int另一方面告訴編譯器,無論何時使用item這個詞,它都指的是一個簡單的類型爲Int的變量。

  • 爲了訪問var item:Int?您的變量的聲明展開的價值,你會總是必須使用item!。編譯器不會猜測變量item是否有值。畢竟,這是可選項的全部目的。爲了清楚表明這些變量可能有或沒有值

  • 本質上,我想說的是,變量一旦聲明爲可選,將總是是一個可選,無論它是否包含值或不。要獲取展開的價值,你將永遠有使用的字符!,除非你決定來存儲它的價值在另一個變量(例如:var unwrappedItem = item!

擺脫你的錯誤,簡單地聲明你的item變量類型爲Int,而不是Int?

至於爲什麼Swift拋出一個錯誤,而不是讓運行時引發異常,這只是一個額外的預防措施,可能會阻止人們使用不好的做法。

+0

即使我像'item!'一樣解開它之前? – snaggs 2014-09-13 14:09:08

+0

我做了一個修改,請再次閱讀我的答案,@fessy。 – 2014-09-13 14:26:40

相關問題