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