Swift/Swift 문법
[클로저 - 1] 클로저와 함수
내일은개발천재🎵
2022. 12. 28. 21:40
클로저
- 이름이 없는 익명 함수
- 이름이 없는 코드의 묶음이다.
- 이름 없이 호출할 수 있는 형태로 사용된다.
- 클로저와 함수는 기능은 완전히 동일하지만, 형태가 다르다.
- 클로저가 함수보다 더 큰 범위이다.
- Python의 lambda와 동일하다.
함수와 클로저의 비교
// 함수의 타입 표기법
let functionA: (String) -> String // 1)파라미터 문자열, 2)리턴형 문자열
let functionB: (Int) -> () // 1)파라미터 정수, 2)리턴형 없음
let functionC: (String) -> Void // 1)파라미터 문자열, 2)리턴형 없음
// 함수로 표현
func aFunction(str: String) -> String {
return "Hello, \\(str)"
}
// 클로저로 표현 -> **중괄호**는 클로저라고 생각하자.
let _ = { (str: String) -> String in
return "Hello, \\(str)"
}
let aClosureType = { () -> () in // 변수에 담아서 호출 가능
print("안녕")
}
Swift는 함수를 1급 객체로 취급한다.
- 함수를 변수에 할당할 수 있다.
- 함수를 파라미터로 전달할 수 있다.
- (함수에서) 함수를 반환할 수 있다.
func aFunction1(_ param: String) -> String {
return param + "!"
}
func aFunction2(name: String) -> String {
return name + "?!??"
}
// 1. 함수를 변수에 할당할 수 있다.
var a: (String) -> String = aFunction1
a("안녕")
a = aFunction2
a("hello")
// 2. 함수(클로저)를 변수에 할당하여 파라미터로 전달할 수 있다.
let closureType = { (param: String) -> String in // 클로저 리터럴
return param + "!"
}
함수에서 클로저로 변형시키기
- 함수의 이름을 없앤다.
- 중괄호를 맨 앞으로 보내고, 그 자리에 **in**을 넣는다.
- 리턴형은 보통 생략한다. (타입 추론 가능)
- 타입 추론이 가능한 경우, 파라미터의 자료형을 생략한다. (대부분 생략 가능)
func add(a: Int, b: Int) -> Int {
let result = a + b
return result
}
{ (a, b) in
let result = a + b
return result
}
앨런님의 강의를 듣고 공부하며 정리한 글입니다.