Swift Closure:
- 클로저는 익명함수이며, 함수와 마찬가지로 First-class Citizen임.
- 자바에서는 람다, 오브젝티브-C에서는 블럭이라고 명칭.
- self-contained code blocks
Named Closures: (Global Function, Nested Function) 함수는 이름이 있는 클로저.
Unnamed Closures: ( Anonymous Function) 익명함수
* 중요: 코드블럭은 호출하기 전까지 실행이 안됨.
생성 문법:
{ (parameters) -> returntype in
statements
}
아래와 같이 c 상수에 할당해 주면 클로저에 이름이 c가 됨.
let c = {
print(“hello”)
}
클로저 헤드는 클로저 바디와 in 키워드로 구분.
함수와 마찬가지로 매개변수와 리턴형이 생략될 수 있으며, 아래가 가장 간단한 closure 형식이 될 수 있음.
{ statements }
{ print(“Hello, Swift”) } // error 주의: 클로저는 글로벌 스코프에서 단독으로 작성할 수 없음.
상수(변수)에 저장하여 사용하는 것은 괜찮음.
let c = { print(“Hello, Swift”) }
parameter와 return형이 생략된 클로저. () -> ()
함수를 전달하는 곳에 클로저를 전달할 수 있으며, 반대의 경우도 가능.
클로저는 이름이 없는 함수인데 c라는 이름을 부쳐줌. 그래서 호출시에는 c()라고 하면 됨.
c() // hello swift가 출력됨.
클로저의 자료형과 함수 자료형과 동일하며, 함수와 호환이 됨.
함수 전달하는 곳에 클로저 전달할 수 있으며 반대 경우도 가능함.
클로저의 파라미터와 리턴형 추가 타입: (String) -> String
let c2 = { (str: String) -> String in
return “Hello, \(str)”
}
let result = c2(“Closure”)
print(result)
중요: 위에 호출문에서도 볼 수 있듯이, Closure에서는 argument label을 사용하지 않음.
그래서 클로저를 호출시에는 아규먼트레이블을 사용하지 않고 바로 아규먼트를 씀.
Inline Closure: 아규먼트로 클로저를 바로 전달되는 경우. 구문이 단순한 경우 사용.
typeAlias
case 1: closure를 파라미터로 전달
typeAlias로 선언 (가독성 위해)
typeAlias SimpleStringClosure = (String) -> String
func perform(closure: SimpleStringClosure) {
print(closure(“iOS”))
}
perform(closure: c2)
iOS를 C2에 파라미터로 전달.
perform(closure: { (str: String) -> String in
return “Hi, \(str)”
})
'Swift' 카테고리의 다른 글
Swift - Optional(옵셔널) (0) | 2020.03.20 |
---|---|
Swift - First Class Citizen (0) | 2020.03.19 |
Swift - Function(함수) (2) | 2020.03.19 |
Swift - Collection(배열,딕셔너리, 셋) (0) | 2020.03.17 |
Swift - 변수와 상수(Constant and Variables in Swift) (0) | 2020.03.16 |