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

Optional vs Bound value assigning var from array

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

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

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

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

感谢任何意见。

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

所以element是一个int,对应数组中的一个索引,bt只有索引被String占用,所以

scoreValueArray[element!]

可以 return 一个 'Index out of bounds',因此想使用 if-let。

不清楚你的 scoreValueArray 是什么类型,但为了这个答案,我假设它是一个 Int.

的数组
var scoreValueArray: Array<Int>

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

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

    subscript (index: Int) -> T

    // more stuff
}

因此,在我们的数组上调用 subscript 方法(这是我们说 scoreValueArray 时所做的)return 是一个非可选的。在条件绑定 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 方法 return 一个可选的 (T?)。如果找到下标中传递的键,字典将 return 一个值,如果传递的键没有值,则字典将 nil 一个值。

我们必须像往常一样避免数组索引越界异常...通过检查数组的长度:

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

虽然接受的答案清楚地说明了为什么可选绑定在当前实现中不可用,但它没有提供解决方案。

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
}