假设我们有String??值。Optional的Optional可能有3种状态:
let strOptOpt1: String?? = .Some(.Some("actual value"))
let strOptOpt2: String?? = .Some(.None)
let strOptOpt3: String?? = .None为了安全地将它们解包到String,在Swift 1.1中,我们可以:
if let str:String = strOptOpt? {
println(str)
}
else {
println("was nil") // `.Some(.None)` or `.None`
}但它在Swift 1.2中不再起作用:
if let str:String = strOptOpt? {
// ^ [!] error: '?' must be followed by a call, member lookup, or subscript目前,我认为,我必须这样做:
if let strOpt = strOptOpt, str = strOpt {
println(str)
}或者使用switch
switch strOptOpt {
case let .Some(.Some(str)):
println(str)
default:
println("was nil")
}但是,我认为肯定有更简单的方法来做到这一点。有人知道吗?
发布于 2015-07-30 02:18:48
从Swift 2开始,您可以将if/case与模式一起使用,并将x?作为.Some(x)的同义词
if case let str?? = strOptOpt1 {
print(str)
} else {
print("was nil") // `.Some(.None)` or `.None`
}发布于 2015-04-10 17:13:23
对我来说,我找到的最好的解决方案是在可选绑定中使用??操作符。
let strOptOpt: String?? = ...
if let str = strOptOpt ?? nil {
println(str) // "actual value"
}适用于所有这些情况:
.Some(.Some("actual value")).Some(.None).None但是,如果strOptOpt为String???,您应该这样做:
let strOptOpt: String??? = ...
if let str = (strOptOpt ?? nil) ?? nil {
println(str)
}发布于 2015-04-15 05:34:29
在这种情况下,我总是得到双可选
let field: ChangeField?? = json["field_id"].int.map{ ChangeField(rawValue: $0) }您可以使用flatMap代替map
let field: ChangeField? = json["field_id"].int.flatMap{ ChangeField(rawValue: $0) }https://stackoverflow.com/questions/28724946
复制相似问题