본문 바로가기

iOS

Swift 클로저

오늘은 Swift 클로저에 대해서 정리를 하려고 한다.

Closure 란?

클로저란 코드의 블럭으로 일급객체의 역할을 한다.

(여기서 일급객체란? 객체를 전달 인자로 보낼 수 있고, 변수나 상수로 저장, 전달이 가능하며, 반환값으로 사용 되는 것을 말한다.)

함수가 클로저의 한 형태이며, 이름이 붙어있는 클로저라고 생각하면된다.

클로저의 기본 형태

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

여기서 'in' 의 키워드는 정의부와 실행부를 분리하기 위해서 사용한다. ( 사실 맨날 개발을 하면서도 궁금했던 부분 중 하나인데 이번에 공부를 하면서 알게되었다. )

클로저는 함수의 매개변수로 넘어가는 용도로 가장 많이 쓰입니다. -> 타입과 타입을 가지고 타입형태를 반환한다.

(사실 이렇게 들었을때는 무슨 말인지 이해가 가지 않았다. 그래서! 예를 통해 이해하려고 하였다.)

Swift 에서 많이 쓰이는 sorted를 예를 들어보았다. 

형태로 보면 이렇게 쓰인다는 뜻 같다. 

String 타입과, String타입을 가지고 -> Bool타입의 형태를 반환한다.

//1. 왼쪽과 오른쪽을 비교해서 왼쪽이 크면 왼쪽이 먼저나오는 함수를 만들었다.
func sortedExample(left: String, right: String) -> Bool {
    // left, right의 비교연산 처리중
    return left > right
}

let subject: [String] = ["math", "english", "sience", "korean"]

//2. 그리고 만들어준 함수를 sorted의 매개변수로 넘겼다 -> 함수가 클로저의 일종이기 때문에 가능하다.
let reversed: [String] = subject.sorted(by: sortedExample(left:right:))
print(reversed)

결과
["sience", "math", "korean", "english"]

 위의 코드블럭 처럼 함수를 만들어서 하는 방법은 나도 이번에 공부를 하면서 처음 본 형태이다. 

그래서 함수가 아닌 클로저가 직접 사용되는 형식으로 변경해 봤다.

let reversed: [String]
reversed = subject.sorted(by: {(left: String, right: String) -> Bool in
    return left > right })
print(reversed)

이름이 없는 클로저가 안쪽으로 들어오게 된다. 

이제 위의 내용을 축약해보면서 클로저 문법을 익히는 연습을 해야겠다. 

[후행 클로저] :

(사실 후행클로저라고 해서 특별한게 있는 줄 알았는데, 클로저를 안에 넣는 것이 아닌 뒤로 빼는 것이 후행 클로저 였다. 이제라도 궁금증이 풀렸으니 넘어가자ㅎ)

ler reversed: [String] = names.sorted {(left: String, right: String) -> Bool in
	return left > right
}

그리고 클로저는 매개변수 타입과 반환 타입을 생략해서 표현할 수 있다. -> sorted 메서드에서 타입을 알고 있기 때문이라고 한다.

let reversed: [String] = names.sorted { (left, right) in 
	return left > right
}

return 키워드를 생략하고 축약된 전달 인자 이름 사용 가능. 

let reversed: [String] = names.sorted {
	return $0 > $1
}

let reversed: [String] = names.sorted { $0 > $1 } 

 

아는 내용이 이렇게 한번씩 정리를 하니깐 도움이 되는 것 같다. 

꾸준히 정리하면서 글을 써봐야겠다. 

'iOS' 카테고리의 다른 글

Swift 싱클톤 패턴  (0) 2020.11.10
Swift Joined()  (0) 2020.10.19
Swift 구조체 vs 클래스  (0) 2020.04.13
Swift 프로토콜  (0) 2020.04.13
Swift 메모리 관리  (0) 2020.04.03