티스토리 뷰
https://www.youtube.com/watch?v=kolg2dim3d4&t=32s
Contents
* 클로저와 함수 타입
* 클로저 API 작성하기
* 클로저와 캡쳐
* escaping, autoclosure
클로저와 함수 타입
클로저 = 함수 객체
클로저의 형태 : 함수, 코드 블록
클로저가 포함된 컨텍스트까지 클로저라고 부름.
> func sayHello(){
print("Hello")
}
> var hello = sayHello
hello()
함수가 다른 변수에 대입할 수 있는 객체가 되었다!
> var hello2 = sayHello
greet(hello2)
> func greet(_arg : () ->Void){
}
다른 함수의 파라미터로, 함수를 사용했다!! '함수타입'은 함수 객체를 참조 변수로 사용하는 타입이다.
(ex)
파라미터 X, 반환값 X : () -> ()
파라미터 String, 반환값 X : (String) -> ()
파라미터 String String, 반환값 X : (String, String) -> ()
파라미터 Int, Int, 반환값 Int : (Int, Int) -> Int
클로저 API 작성하기
inline 방식으로 정의하기
{ (파라미터)-> 리턴타입 in
//코드
}
클로저 표현식 단축
타입 선언 생략
> array.sorted(by: { a, b -> Bool in return a** 리턴이 1줄인 경우 : 리턴 생략
> array.sorted(by: {a, b -> Bool in a** 리턴 타입 선언 생략
> array.sorted(by: {a, b in a < b } )
파라미터 선언 생략
> array.sorted(by: { $0 < $1 })
Trailing Closure
클로저 파라미터가 마지막인 경우, 괄호 밖에 작성할 수 있다.
원래
> array.sorted(by: {( a , b) -> Bool in a < b })
trailing closure
> array.sorted( { a, b in a < b }
파라미터가 클로저 1개 뿐이면, 괄호식도 생략할 수 있다.
> array.sorted { a, b in a < b }
클로저 사용 API
반환값이 함수이고, 타입은 ()->()라고 해 보자.
> func greeting() -> (()-> ()) {
> func sayGoodMorning(){
> print("good morning")}
> }
> return sayGoodMorning
> }
greeting 안에서 sayGoodMorining이라는 함수를 정의해서 리턴해 주었다.
let funcA = greeting()
funcA()
똑같은 함수를 인라인 방식으로 선언할 수도 있다
func greeting()->(()->()){
return { ()-> () in
print ("good morning")
}
}
()-> () in 은 생략가능하다.
# 클로저와 옵셔널
> func multiply(_i: Int, _j:Int, _handler: ((Int)->Void?)
클로저에서 프로퍼티에 접근할 때 : self 키워드를 써야 한다!
class MyClosureClass{
** var value =0**
** func showAndPrint()->()->(){**
** return { print(self.value) }**
** }**
}
//showAndPrint는 매개변수를 안받고, 매개변수와 리턴이 없는 함수를 리턴해준다.
escaping, noescaping
파라미터로 함수가 사용될 때!
- no escaping(기본 설정)
- 함수 외부에 사용 금지, 프로퍼티로 설정하면 에러 남.
- 다른 함수 파라미터로 넘기는 건 가능.
- func aaa(_arg : ()->()){
//여기 안에서만 함수 사용. arg를 다른 변수에 대입하려고 하면 에러가 났다.
} - func aaa(_arg : ()->()){
otherFunc(arg)
} 이건 가능하다! - @escaping을 붙여주면, escaping 설정이 가능해짐.
autoclosure
- 파라미터가 없는 표현식을 클로저로 변환해준다
- @autoclosure을 붙여주게 되면, 자동으로 클로저로 바꿔준다.
func dolt(_ argc: () -> ()) {
argc()
}
func dolt2(_ argc: @autoclosure () -> ()) {
argc()
}
dolt {
print("hello world!")
}
dolt2(print("hello world!"))
'macOS, iOS' 카테고리의 다른 글
[swift] Generics(제너릭스, T) (0) | 2019.07.08 |
---|---|
Xcode 단축키들 (0) | 2019.07.05 |
iOS 버전 체크를 하는 올바른 코드 (0) | 2019.07.05 |
swift의 고차 함수 (0) | 2019.07.04 |
Functional Programming을 처음 본다면 (0) | 2019.07.04 |