迅速而又多重条件?

时间:2018-12-08 21:29:35

标签: swift closures

struct Parser<A> {
    let parse: (String) -> (A,String)?
}

func character(condition:@escaping (Character) -> Bool) -> Parser<Character> {
    return Parser(parse: {str in
        guard let char = str.first, condition(char) else {
            return nil
        }
        return (char,String(str.dropFirst()))
    })
}

在上面的代码中,我很难弄清楚会发生什么。更具体地,

let char = str.first, condition(char)

吗?这甚至是合法的构想吗?代码必须按要求进行编译,但是发生了什么? let char = str.first是一个赋值,condition(char)是一个布尔值。如何分配赋值后加逗号,然后赋值布尔值。

1 个答案:

答案 0 :(得分:1)

  

更具体的是,什么

   let char = str.first, condition(char)
     

吗?

什么都没有。您的代码中没有这样的表达式。

这是什么:

guard let char = str.first, condition(char)

guard发挥了所有作用。逗号通过嵌套连接两个条件,因此实际上是有效的(因为guardif的一种形式):

if let char = str.first

if condition(char)

您肯定对这两者都足够了解吗?如果不是这样,if let可能是您唯一不熟悉的东西,它对于Swift来说是极其重要的,并且易于学习。它可以安全地解开Optional,避免因尝试解开nil而崩溃的危险。