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



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

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

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

所以试着改变!到但是错误仍然存在。

感谢任何意见。

scoreValueArray是一个字符串数组,其中如果满足条件,字符串值会附加到数组中,然后数组会保存为NSUserdefault。

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

scoreValueArray[element!]

可能返回"索引越界",因此希望使用iflet。

尽管公认的答案清楚地说明了为什么可选绑定在当前实现中不可用,但它并没有提供解决方案。

正如这个答案所示,协议提供了一种安全检查数组边界的优雅方法。这是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
}

不清楚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]
}

最新更新