我想检查数组中是否有值,如果是,则使用if-left语句分配给String:
if let scoreValue = scoreValueArray[element!]{
// do something with scoreValue
}
错误:条件绑定中的绑定值必须是可选类型
所以尝试改变了!至 ?但错误仍然存在。
任何意见都赞赏。
scoreValueArray是一个字符串数组,如果满足条件,则将String值附加到数组,然后将数组保存到NSUserdefaults。
所以element是一个int,它对应于数组中的索引,bt只有当索引被String占用时才这样,所以
scoreValueArray[element!]
可以返回“超出范围的索引”,因此想要使用if-let。
答案 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]
}