我尝试使用多个值创建一个简单的if-let语句。只有当所有可选变量都是非零时才应执行if
块,并且应该将它们分配给仅位于if
块内的新let-vars(常量?),就像正常的单一赋值if-let。
var a: String? = "A"
var b: String? // nil
if let (m, n) = (a, b) {
println("m: \(m), n: \(n)")
} else {
println("too bad")
}
// error: Bound value in a conditional binding must be of Optional type
// this of course is because the tuple itself is not an Optional
// let's try that to be sure that's the problem...
let mysteryTuple: (String?, String?)? = (a, b)
if let (m, n) = mysteryTuple {
println("m: \(m), n: \(n)")
} else {
println("too bad")
}
// yeah, no errors, but not the behavior I want (printed "m: A, n: nil")
// and in a different way:
if let m = a, n = b {
println("m: \(m), n: \(n)")
} else {
println("too bad")
}
// a couple syntax errors (even though 'let m = a, n = b'
// works on its own, outside the if statement)
这甚至可能吗?如果不是(我猜测),您认为Apple将来(或应该)实施此项目吗?
答案 0 :(得分:9)
现在可能很明显,但是你对这个预期功能的追求可能会随着Swift 1.2的发布而结束。
来自快速博客:https://developer.apple.com/swift/blog/?id=22
更强大的可选展开if if let - if let构造 现在可以一次打开多个选项,以及包括 干预布尔条件。这可以让你表达条件 控制流程没有不必要的嵌套。
但缺点是,除了用where子句约束值之外,你现在可以做你想要的了。
if let a = foo(), b = bar() {
}
答案 1 :(得分:7)
在决定是否可能之前,请考虑为什么if - let ...
条件使用单个可选值:此代码编译的原因
if let constVar = testVar {
...
}
是所有可选类型都符合LogicalValue
协议,该协议处理可选值的空检查。
这解释了为什么使用可选元组的技巧也不起作用:如果元组本身为非空,则检查LogicalValue
的实现,忽略其组件。 Apple决定背后的逻辑很清楚:当元组的所有元素类型都是可选的时,它们不是为元组做例外,而是采用统一的方法,并以与处理其他可选类型相同的方式处理元组。
当然,通过额外的代码行实现您尝试实现的逻辑很容易:
if a != nil && b != nil {
let (m, n) = (a!, b!)
println("m: \(m), n: \(n)")
} else {
println("too bad")
}