微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift:if-let并行赋值

我正在尝试使用多个值创建一个简单的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将来(或应该)将来实施这个吗?

在决定是否可能之前,请考虑为什么if – let … conditionals使用单个可选值:此代码编译的原因
if let constvar = testvar {
    ...
}

是所有可选类型都符合LogicalValue协议,该协议处理可选值的空检查.

这解释了为什么使用可选元组的技巧也不起作用:如果元组本身是非null,则检查LogicalValue的实现,忽略其组件. Apple决定背后的逻辑很明确:当元组的所有元素类型都是可选的时,它们不是为元组做例外,而是采用统一的方法,并以与处理其他可选类型相同的方式处理元组.

当然,通过额外的代码行实现您尝试实现的逻辑很容易:

if a != nil && b != nil {
    let (m,n) = (a!,b!)
    println("m: \(m),n: \(n)")
} else {
    println("too bad")
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐