IOS- 10

김정현·2023년 3월 18일
0

IOS 개발공부 일지

목록 보기
10/27

클로저

클로저는 변수나 상수가 선언된 위치에서 참조를 획득하고 저장할 수 있다. 함수도 클로저의 일종이다. 클로저는

{(매개변수들) -> 반환 타입 in
  실행 코드
}   

형식을 따르고 크게 세가지로 나뉜다.

  • 이름이 있고 어떤 값도 획득하지 않은 형태
  • 이름이 있고 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태
  • 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성한 형태
var sum: (Int, Int) -> {(a: Int, b: Int) ->Int in
return a + b
}           

후행 클로저

함수나 메서드의 마지막 전달인자로 위치하는 클로저는 함수나 메서드의 소괄호를 닫은 후 작성해도 된다. 후행 클로저는 맨 마지막 전달인자로 전달되는 클로저에만 해당된다.

func calculate(a: Int, b: Int, method: (Int, Int) -> Int {
   return a + b
}



var result

result = calculate(a: 10, b:10) {(left: Int, right: Int) -> Int in       //소괄호 밖으로 클로저를 빼줌. 마지막 전달인자만 가능
    return left + right
 }

클로저 표현 간소화

반환 타입 생략

매서드의 전달인자로 전달하는 클로저는 메서드에서 요구하는 형태로 전달해야하기 떄문에 적합한 타입을 유추할 수 있다.

func calculate(a: Int, b: Int, method: (Int, Int) {     //	반환타입 생략됨
   return a + b
}




result = calculate(a: 10, b:10) {(left: Int, right: Int) in      //후행 클로저와도 동시에 사용 가능
    return left + right
 }

단축 인자 이름

앞서 예로 든 두 코드 left, right 두 매개변수는 아무 의미없다.

result = calculate(a: 10, b:10, method: {
    return $0 + $1       //$0은 Int타입의 첫 번째 매개변수
})



result = calculate(a: 10, b:10) {
    return $0 + $1   //후행 클로저도 같이 사용 가능
}

암시적 반환 표현

클로저가 반환 값을 갖고 내부의 실행문이 단 한줄이라면 return을 생략가능하다./

result = calculate(a: 10, b:10) {
    $0 + $1      //return도 생략
}

결과적으로

result = calculate(a: 10, b:10) {(left: Int, right: Int) -> Int in       
    return left + right
 }
 
 vs
 
 result = calculate(a: 10, b:10) { $0 + $1 }

이렇게 많이 생략할 수 있게된다.

탈출 클로저

함수의 전달인자로 전달한 클로저가 함수 종료 후에 호출될 때 클로저가 함수를 탈출한다고 표현한다. 매개변수의 이름의 :escaping을 키워드를 사용하여 클로저 탈출을 허용하낟. 따로 명시하지 않는다면 비탈출 클로저이다. 함수로 전달된 클로저가 함수의 동작이 끝난 후 필요가 없을 떄 비탈출 클로저를 사용한다.

자동 클로저

함수의 전달인자로 전달하는 표현을 자동으로 변환해주는 클로저이다. 자동 클로저는 전달인자를 갖지 않는다. 자동 클로저는 호출되었을 때 자신이 감싸고 있는 코드의 결과값을 반환한다.

클로저는 이해가 잘 안된다.. 다음에 다시 한번 보자

0개의 댓글