我正在尝试使用多个值创建一个简单的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 举报,一经查实,本站将立刻删除。