Свифт и множественные условия? - PullRequest
0 голосов
/ 09 декабря 2018
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 голосов
/ 09 декабря 2018

Более конкретно, что делает

   let char = str.first, condition(char)

?

Ничего.В вашем коде нет такого выражения.

Что есть это:

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

Это guard имеет все значение.Запятая объединяет два условия, как при вложении, так что в действительности мы имеем (поскольку guard является формой if):

if let char = str.first

и

if condition(char)

Вы понимаетеобоих достаточно хорошо, конечно?Если нет, то единственная оставшаяся вещь, которая может быть вам незнакома, - это if let, которая чрезвычайно важна для Swift и о которой легко узнать;он разворачивает опционально безопасно, избегая опасности сбоя при попытке развернуть ноль.

...