Junkor

拆解多个optional值(Unwrapping multiple optionals)

文章翻译自objc,原文连接:『Unwrapping multiple optionals

Swift1.2带来了很多新的变化,这一节我们来看一下unwrap多个optional值。在前边的『Applicative Functors』中,我们通过使用applicative functors来避免嵌套的if语句。如果你还有印象的话,我们大概是从下边的代码开始的:

if let email = getEmail() {
    if let pw = getPw() {
        login(email, pw) { println("success: \($0)") }
    } else {
        // error...
    }
} else {
    // error...
}

通过自定义的<*>操作符和使用curry操作,我们它重构成了下边的单个if语句的形式:

if let f = curry(login) <*> getEmail() <*> getPw() {
    f { println("success \($0)") }
} else {
    // error...
}

然而,在swift1.2中,我们可以通过在一个if语句中同时拆解多个optional值的方式取代自定义操作符和curry的方式:

if let email = getEmail(), pw = getPw() {
   login(email, pw) { println("success: \($0)") }
}

在上边的代码中,很轻松就能读懂发生了什么,还不用了解applicative functor的语法,语言的一小半,编码的一大步。