[iOS] Swift - Closure

김말이·2023년 8월 6일
0

Closure

내부 함수와 내부 함수에 영향을 미치는 주변 환경(Context)을 모두 포함한 객체

  1. 전역 함수
    • 이름을 갖고, 값을 참조하지 않음
  2. 중첩 함수
    • 이름을 갖고, 내부 함수로부터 값을 참조할 수 있음
  3. 클로저 표현식
    • 주위를 둘러싸고 있는 Context로부터 값을 얻을 수 있는 문법의 형태(값을 참조할 수 있음)

클로저 표현식의 형태

{(매개변수) -> 반환타입 in 실행코드}

함수의 형태와 클로저 표현식의 형태로 작성한 코드

Named Closure

func sumFunction(a: Int, b: Int) -> Int {
	return a + b
}

var sumResult: Int = sumFunction(a: 1, b: 2)

Unnamed Closure

var sum: (Int, Int) -> Int = {(a: Int, b: Int) in
	return a + b
}

sumResult = sum(1, 2)

1급 객체의 특징

1급 객체(First-Class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다

  • Closure는 정의되어 있는 상수나 변수들에 대해 참조 및 저장해서 사용할 수 있다.

변수 또는 상수에 클로저를 담을 수 있다

let closure = { () -> () in
    print("Closure")
}
let closure2 = closure

클로저 또한 변수나 상수에 대입할 수 있고, 이 대입된 변수나 상수로 실행도 할 수도 있다.

파라미터 타입으로 클로저를 전달할 수 있다

func doSomething(closure: () -> ()) {
    closure()
}

doSomething이라는 함수가 존재할 때,

doSomething(closure: { () -> () in
    print("Hello!")
})

파라미터로 클로저를 넘겨주고 있는 모습이다.

반환 값으로 클로저를 전달할 수 있다

func doSomething() -> () -> () {
    
    return { () -> () in
        print("Hello Sodeul!")
    }
}

let closure = doSomething()
closure()

또한 호출하는 곳에서 클로저를 받아서 사용할 수 있다.

profile
공부해서 남주자

0개의 댓글