Closure

anonymous function, 익명함수

함수를 인자로 전달하기

func calculator(n1: Int, n2: Int, oper:(Int, Int) -> Int) -> Int {
    return oper(n1, n2)
}

func add(n1: Int, n2: Int) -> Int {
    return n1 + n2
}

calculator(n1: 12, n2: 3, oper: add(n1:n2:))
calculator(n1: 1, n2: 1111, oper: add)

위의 코드를 줄인다 ... 지금도 충분히 짧아 보이는데?

클로저 만들기

  1. func 키워드와 함수이름 제거

    
    calculator(n1: 12, n2: 3, oper: multi(n1:n2:))
    
    ~~func multi~~(n1: Int, n2: Int) -> Int {
        return n1 + n2
    }
    
  2. 오픈 중괄호를 맨앞으로 , 파라미터뒤에 in 키워드 넣기

    calculator(n1: 12, n2: 3, oper: multi(n1:n2:))
    
    { (n1: Int, n2: Int) -> Int in
        return n1 * n2
    })
    
  3. operator 변수 자리에 넣기

    calculator(n1: 1, n2: 1111, oper: { (n1: Int, n2: Int) -> Int in
        return n1 * n2
    })
    
  4. 코드를 더 줄이기 극한의 코드 없애기... 삼항연산자를 싫어하는 제 스타일은 아니네요😮‍💨

    calculator(n1: 1, n2: 1111, oper: { (n1: ~~Int~~, n2~~: Int~~) ~~-> Int~~ in
        ~~return~~ n1 * n2
    })
    
    1. 매개변수타입은 알아서 형변환을 해주니까 생략
    2. 리턴타입도 컴파일러가 알아서 해주니까 생략
    3. 리턴 키워드도 컴파일러를 믿는다! 생략
  5. 좀 더 할 수 있어 !🤢

    calculator(n1: 1, n2: 1111, oper: { (n1, n2) in n1 * n2})
    
  6. 달러 키워드로 매개변수 통일

    calculator(n1: 1, n2: 1111, oper: { $0 * $1})
    
  7. 한번더!!! 🤮

    calculator(n1: 1, n2: 1111) {$0 * $1}
    

    ...

정리를 하자면, 매개변수로 함수를 받는 경우에 클로저개념을사용하면 위와 같이 구현할 수 있다.

sample

let array = [1,2,3,4]

func addOne(num: Int) -> Int {
    return num + 1
}

array.map(addOne(num:))

var res = array.map{$0 + 1}

Question