Curry Function in Swift

后端 未结 4 1615
予麋鹿
予麋鹿 2020-12-01 19:24

I want to make a function that return a curry function like below

func addTwoNumbers(a: Int)(b: Int) -> Int {
    return a + b
}

addTwoNumbers(4)(b: 6) /         


        
4条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-01 19:43

    I recently found that currying was removed back in Swift3. I created my own version which is repetitive but does the job.

    precedencegroup CurryPrecedence {
        associativity: left
        higherThan: MultiplicationPrecedence
    }
    infix operator <<== :CurryPrecedence
    //1 param
    func <<==(_ f: @escaping (A) -> (Z), _ p:A) -> () -> (Z)  {
        { f(p) }
    }
    //2 param
    func <<==(_ f: @escaping (A, B) -> (Z), _ p:B) -> (A) -> (Z)  {
        { (A) in f(A,p) }
    }
    //3 param
    func <<==(_ f: @escaping (A, B, C) -> (Z), _ p:C) -> (A, B) -> (Z)  {
        { (A, B) in f(A,B,p) }
    }
    //4 param
    func <<==(_ f: @escaping (A, B, C, D) -> (Z), _ p:D) -> (A, B, C) -> (Z)  {
        { (A, B, C) in f(A,B,C,p) }
    }
    

    To use it:

    let ten = (addTwoNumbers <<== 6 <<== 4)()
    

    or

    let ten = (addTwoNumbers <<== 6)(4)
    

提交回复
热议问题