[iOS/Swift] 클로저란?

chaentopia·2023년 3월 10일
0

클로저는 Named Closure, Unnamed Closure 두 가지 종류가 있다.

Named Closure

함수라고 불리는 이름이 붙여진 클로저

Unnamed Closure

이름을 붙이지 않고 사용하는 함수, 익명함수 → 보통 클로저를 이야기하면 Unnamed Closure를 이야기한다. 클로저는 간결함과 유연함이라는 장점을 갖고 있다.

표현식은 다음과 같다.

{ (Parameters) -> Return Type in 
	실행 구문
}
func sayHi() -> String {
	return "Hi"
}
print(sayHi())

함수 부분에서 작성한 이 함수를 클로저 형태로 바꿔본다면

let say1 = { () -> String in
	return "Hi"
}
print(say1) //Hi

이렇게 작성할 수 있다.

후행 클로저

클로저가 함수의 마지막 전달인자라면 마지막 매개변수의 이름을 생략한 후, 함수 소괄호 외부에 클로저를 구현할 수 있게 해주는 것이다.

//후행 클로저 미실시
let reversed = names.sorted(by:{ (s1:String, s2: String) -> Bool in
	return s1 > s2
})

//후행 클로저 실시
let reversed = names.sorted() { (s1: String, s2: String) -> Bool in
	return s1 > s2
}

//메서드가 단 하나의 클로저만을 전달 인자로 할 경우 소괄호도 생략 가능
let reversed = names.sorted { (s1: String, s2: String) -> Bool in
	return s1 > s2
}

클로저의 축약 표현들

위의 예시를 통해서 알아봅시다.

let reversed = names.sorted(by:{ (s1:String, s2: String) -> Bool in
	return s1 > s2
})

클로저는 메서드에서 요구하는 형태로 전달해야 한다는 규칙이 있기 때문에 문맥을 통해서 타입을 유추할 수 있다. 때문에 매개변수 타입과 반환 타입을 생략할 수 있다.

let reversed = names.sorted(by:{ (s1, s2) -> in
	return s1 > s2
})

매개 변수의 이름을 생략할 수 있다. 이름을 명시하지 않고도 $와 숫자의 조합으로 단축 인자 이름 사용이 가능하다. 매개변수의 이름을 명시하지 않아도 되기 때문에 in 키워드도 생략 가능하다

let reversed = names.sorted(by: {
	return $1 > $2
})

클로저가 반환 값을 갖고, 내부 실행문이 한 줄이라면 암시적으로 이 실행문을 반환 값으로 사용 가능하다. 즉, return 키워드 생략이 가능하다.

let reversed = names.sorted(by: {
	$1 > $2
})

(여기서 끝이 아니다..) 클로저는 매개변수의 타입과 반환 타입이 연산자를 구현한 함수의 모양과 동일하다면, 연산자만 표기하더라도 알아서 연산하고 반환한다. 즉, 연산자만 남겨도 된다.

profile
the pale blue dot

0개의 댓글