Use logical operator as combine closure in reduce

前端 未结 6 1440
星月不相逢
星月不相逢 2020-12-15 04:01

I am trying to reduce an array of Bools by applying the logical operator OR (||) using the following code, however I get an error:

6条回答
  •  情深已故
    2020-12-15 04:56

    This happens because of Swifts closure semantics. It takes your arguments and applies function to them, omitting argument names.

    protocol Numeric {
        ...
        public static func +(lhs: Self, rhs: Self) -> Self
        ...
    }
    

    In example with Ints, you would pass (Int, Int) into a closure, and + function in Numeric protocol expects exactly two ints to sum them.

    Thats why code like below works just fine

    [1, 2, 3, 4].reduce(0, +)
    

    Because you just took 2 ints, and applied function, which takes just two ints. If you write your own function, which would take just two argument, it would work as well.

    func myOwnAwesomeFunc(a: T, b: T) -> T { in
        return 1 // production ready
    }
    
    [1, 2, 3, 4].reduce(0, myOwnAwesomeFunc) // prints 1
    

    Good so far. But why can't we write

    [true, false, true].reduce(false, ||) // yields Cannot invoke 'reduce' 
    // with an argument list of type 
    // '(Bool, (Bool, @autoclosure () throws -> Bool) throws -> Bool)'
    

    That's because this operator takes bool and a closure, which returns bool. Not bool, closure! But if it is like this, why aren't we writing true || { false }() ? Thats because of @autoclosure, which takes care of curly braces for us.

    Main question, why is it implemented this way, so we can't use Swifts awesome short-hand closure syntax with booleans? Idk

提交回复
热议问题