티스토리 뷰

https://www.youtube.com/watch?v=kolg2dim3d4&t=32s

참고 자료 : [https://www.youtube.com/watch?v=kolg2dim3d4&t=32s](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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함