2015-04-02 53 views
0

分配VAR我要檢查,如果有一個數組中的值,如果是這樣使用,如果左語句分配給一個字符串:可選VS限值從陣列

if let scoreValue = scoreValueArray[element!]{ 
       // do something with scoreValue 
      } 

Error: Bound value in a conditional binding must be of optional type

所以試圖改變!!至 ?但錯誤仍然存​​在。

任何輸入讚賞。

scoreValueArray是一個字符串數組,如果滿足條件,則將字符串值附加到數組,然後將數組保存到NSUserdefaults。

所以元素是對應於一個索引數組中,BT只有當指數與字符串佔用的INT,所以

scoreValueArray[element!] 

會返回一個「索引越界」,因此希望使用if-let。

+0

你能否提供準確上'scoreValueArray'就是一些背景,什麼'element'是什麼? – nhgrif 2015-04-02 21:03:39

+0

這意味着scoreValueArray [element!]不會返回可選值。你仍然需要檢查你的索引是否小於你的數組數 – 2015-04-02 21:05:25

回答

1

目前尚不清楚你的scoreValueArray是什麼類型,但爲了這個答案,我將假定它是一個Int的數組。所以

struct Array<T> : MutableCollectionType, Sliceable { 
    // other stuff... 

    subscript (index: Int) -> T 

    // more stuff 
} 

,調用subscript方法我們的陣列(也就是當我們說我們做什麼:現在

var scoreValueArray: Array<Int> 

,如果我們看看Array結構的定義,我們會發現這scoreValueArray)返回一個非可選項。非條款約束條件不能用於條件約束if let/if var報表。

我們能夠以更簡單的例子,重複此錯誤消息:

let foo: Int = 3 

if let bar = foo { 
    // same error 
} 

這將產生同樣的錯誤。如果我們不是做更多的東西一樣,下面我們能夠避免的錯誤:

let foo: Int? = 3 

if let bar = foo { 
    // perfectly valid 
} 

這是一本字典,其subscript方法確實返回一個可選的(T?)不同。如果找到下標中的密鑰,字典將返回一個值,如果傳遞的密鑰沒有值,字典將返回值nil

我們必須避免以同樣的方式,我們總是做數組索引出界外例外...通過檢查數組的長度:

if element < scoreValueArray.count { 
    scoreValue = scoreValueArray[element] 
} 
+0

謝謝讓分配更有意義,我會嘗試一種不同的方法 – dancingbush 2015-04-02 22:01:12

3

雖然接受的答案明確提出,爲什麼可選的結合是在當前的實施中不可用,它不提供解決方案。

正如this answer所示,協議提供了一種安全檢查數組邊界的優雅方法。這是Swift 2。0版本:

extension Array { 
    subscript (safe index: Int) -> Element? { 
     return indices ~= index ? self[index] : nil 
    } 
} 

您可以使用這樣的:

let fruits = ["Apple", "Banana", "Cherry"] 

if let fruit = fruits[safe: 4] { 
    // Do something with the fruit 
}