可选vs绑定值从数组中分配var

时间:2015-04-02 20:59:47

标签: swift binding optional

我想检查数组中是否有值,如果是,则使用if-left语句分配给String:

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

错误:条件绑定中的绑定值必须是可选类型

所以尝试改变了!至 ?但错误仍然存​​在。

任何意见都赞赏。

scoreValueArray是一个字符串数组,如果满足条件,则将String值附加到数组,然后将数组保存到NSUserdefaults。

所以element是一个int,它对应于数组中的索引,bt只有当索引被String占用时才这样,所以

scoreValueArray[element!]

可以返回“超出范围的索引”,因此想要使用if-let。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

不清楚scoreValueArray的类型是什么,但为了这个答案,我将假设它是Int的数组。

var scoreValueArray: Array<Int>

现在,如果我们查看Array结构的定义,我们就会发现:

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

    subscript (index: Int) -> T

    // more stuff
}

因此,在我们的数组上调用subscript方法(这是我们在说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]
}