我想检查数组中是否有值,如果有,使用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]
}