swift에서 정말 많이 쓴다는 클로저, 정리가 안되어 다시한번 정리 해본다.
클로저의 기본형태
{ (매개변수 목록) -> 반환타입 in
// 실행될 코드
}
1급 객체함수, Unnamed Closure 등 여러가지의 특성을 갖고 있다.
1급 객체란?
- 전달인자를 전달가능
- 동적 프로퍼티에 할당 가능
- 변수나 데이터구조안에 담을수 있음
- 반환값으로 사용가능
- 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별가능
어?, 그렇다면 클로저가 Unnamed Closure라면 반대로 named Closure도 존재하겠네?
우리가 알고있는 함수가 바로 이름을 갖고 있는 named Closure인것 (hello 라는 이름을 갖고 있다)
하지만 우리는 함수라고 칭하고 있다
func hello() {
print("나는 named Closure")
}
1급 객체함수이기 때문에 클로저는 변수, 상수 등에 대입할 수 있다.
그렇다면 기본형태에 맞게 클로저를 구성해볼까?
isClosure라는 상수에 클로저를 대입해서 사용해주었다.
let isClosure = { (name: String) -> String in
return "my name, \(name)"
}
1급 객체함수이기 때문에 대입한 변수, 상수를 사용하여 호출이 가능하다.
호출하는 형식도 함수와 동일하게 (괄호)사용하여 호출한다.
그런데 name이라는 Argument Label이 있어보여서 이렇게 호출하는것으로 생각하겠지만
isClosure( name: "Yoonds") // Error!!!
클로저는 Argument Label이 존재하지않는 오직 Parameter Name이기 때문에
인자값만 작성하여 호출한다.
isClosure("Yoonds")
또한 만들었던 클로저를 다시 담을수도 있다.
let isClosure2 = isClosure
그리고 핵심이자, 중요한 클로저는 함수의 파라미터로 들어올수 있다.
말로는 이해가 어려우니 코드로 살펴본다.
- 미리 add 클로저와, minus 클로저를 정의한다.
- 이후 calculate메소드를 생성해 인자로 숫자와 클로저형태의 method를 정의한다
- calculateResult를 선언함과 동시에 calculate 사용할 Int값과 미리 정의한 연산할 클로저를 넣는다. (add 또는 minus)
// 더하기연산 클로저
let add: (Int, Int) -> Int
add = { (a: Int, b: Int) in
return a+b
}
// 빼기연산 클로저
let minus: (Int, Int) -> Int
minus = { (a: Int, b: Int) in
return a-b
}
// method라는 이름으로 클로저를 파라미터로 받을 준비
func calculate(a: Int, b:Int, method: (Int, Int) -> Int) -> Int {
return method(a,b)
}
// 인자로 숫자를 너줌과 동시에 minus 클로저 활용하여 연산
var calculateResult = calculate(a: 20, b: 15, method: add) //결과 : 35
솔직히 클로저가 완벽히 이해안되는 상황에서 위코드를 보면서 공부하였을때 많이 신세계였다..
클로저.. 대단한것같으면서 어려운 존재?
자, 위에서 add라는 클로저를 미리 정의한후에 파라미터로 method에 담아서 사용하였는데
add클로저를 미리 정의하지 않고 calculate를 호출하면서 정의가 가능할까? 무슨말이지?..
코드로 살펴본다.
func calculate(a: Int, b:Int, method: (Int, Int) -> Int) -> Int {
return method(a,b)
}
var calculateResult = calculate(a: 20, b: 15, method: {(c: Int, d: Int) -> Int in
return c + d //결과 : 35
})
위에 코드를 보면 상단코드와 달리 add라는 클로저를 미리 정의하지않고 동일한 계산식을
calculate를 호출해주면서 파라미터 형식에 맞게 클로저형태로 정의하였다.
쉽게 말해 따로정의해서 붙일것인지 호출할때 정의를 함께 하거나 차이다.
코드가 경량화 및 직관적으로 변하므로.. 아래의 방법이 헷갈릴수는 있지만
필자는 아래의 방법이 익숙해질정도로 사용해보려고한다.
여기까지는 기본편이므로 다음편에서는 좀더 심화적으로 다뤄보겠다.(심화로 다뤄본 링크)
'Swift(IOS)' 카테고리의 다른 글
| [내용정리] Swift - closure(클로저)란? (2/2) (0) | 2022.02.08 |
|---|---|
| [내용정리] Swift - JsonArray와 JsonObject의 차이 (0) | 2022.02.03 |
| [내용정리] Swift - UITableVIew Delegate, DataSource 종류 (0) | 2022.01.26 |
| [내용정리] Swift - 코드로(Programmatically) 검색기능 구현 (0) | 2022.01.13 |
| [내용정리] Swift - URLSession 이란? (0) | 2022.01.11 |