[ swift - closure ]

Yr Yr·2023년 12월 21일

TIL

목록 보기
21/39

closure

  • 클로저
    - 코드 블럭
    - 변수,상수 등으로 저장할 수 있고 전달인자로 전달이 가능하다.

    // 형태
    { (매개변수) -> 반환타입 in
    	실행코드
    }
    
    // 클로저 사용
    var sumClosure: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
    	return a + b
    }
    sumResult = sum(1,2)
    print(sumResult)
    
    // 함수의 전달인자로서의 클로저
     let add: (Int,Int) -> Int
     add = { (a: Int, b: Int) -> Int in
     		return a + b
     }
     let subtract: (Int,Int) -> Int
     subtract = { (a: Int, b: Int) -> Int in
     				return a - b
     }
     
     func calculate(a: Int, b: Int, method: (Int,Int) -> Int) -> Int {
     		return method(a,b) // 함수 안에서 전달받은 클로저를 호출해준다.
     }
     
     var calculated: Int
     calculated = calculate(a: 50, b: 10, method: add)
     print(calculated) // 60
     calculated = calculate(a: 50, b: 20, method: substract)
     print(calculated) // 30
     
     // method의 전달인자로 클로저를 받아서 사용할 수도 있다.
     calculated = calculate(a: 50, b: 10, method: { left: Int, right: Int) -> Int {
     		return left * right
     }
     print(calculated) // 500
  • 후행클로저

    // 형태
    함수(매개변수) { 클로저 }
    
    // 클로저가 함수의 마지막 전달인자라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있다.
    result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
    		return left + right
    }
    print(result) // 20
    
    // method 매개변수는 Int 타입을 반환할 것이라는 사실을 컴파일러도 알기 때문에 클로저에서 반환타입을 명시해주지 않아도 된다. in은 생략 불가
    result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) in
    	return left + right
    })
      // 후행클로저와 함께 사용할 수도 있다. 
    	result = calculate(a: 10, b:10) { (left: Int, right: Int) in
      		return left + right 
      }
    // 클로저의 매개변수 이름이 불필요하다면 단축 인자이름을 활용할 수 있다. 매개변수 순서대로 $0,$1...으로 표현한다. 다른 사람이 봤을 때 이해할 수 있도록 적절히 활용해야 한다.
    result = calculate(a: 10, b: 10, method: {
    	return $0 + $1
    }
      // 후행클로저와 함께 사용할 수도 있다.
      result = calculate(a: 10, b: 10) { 
      		return $0 + $1
      }

0개의 댓글