본문 바로가기

ComputerScience/ios App(Storyboard)

ios - 9 swift 기본문법 (Closure)

728x90

1 Closure

- closure는 크게 global함수, nested 함수, closure expression 세가지가 있다.

- 쉽게는 이름없는 함수라고 이해하면 된다.

- 함수처럼 변수에 할당할 수 있다.

- 변수에 할당할 수 있고 인자를 받아 결과를 리턴할 수 있는 타입을 First Class Type이라고 하는데 closure는 이에 해당한다.

- closure로 두 숫자를 받아서 곱해주는 함수를 정의해보자

- 다양한 축약형이 가능하다.

var multiplyClosure: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
    return a * b
}

var multiplyClosure2: (Int, Int) -> Int = { a, b in
    return a * b
}

var multiplyClosure3: (Int, Int) -> Int = { return $0 * $1 }

multiplyClosure(4, 2)

- 아래 처럼 input과 output이 없는 closure도 정의 가능하다.

let voidClosure: () -> Void = {
    print("Void closure")
}

- 개발에 있어서 closure를 Parameter로 받는 형태가 많이 나온다.

var multiplyClosure: (Int, Int) -> Int = { a, b in
    return a * b
}

func operateTwoNums(a: Int, b:Int, operation: (Int, Int) -> Int) -> Int {
    let result = operation(a,b)
    return result
}
operateTwoNums(a: 3, b: 4, operation: multiplyClosure)

- 이번에는 인자로 closure를 미리 만들어 놓고 넘기지 말고 closure를 즉석에서 만들어보자.

func operateTwoNums(a: Int, b:Int, operation: (Int, Int) -> Int) -> Int {
    let result = operation(a,b)
    return result
}
operateTwoNums(a: 3, b: 4) { a, b in
    return a*b
}
func calculator(operation: () -> Void ) {
    print("function called")
    operation()
}

calculator(operation: {
    print("pass closure as parameter")
})

- 좀더 짧게 쓰기 위해 operateTwoNums처럼 calculator에서도 "operation:"을 생략할 수 있다. 이를 trailing closure라고 한다.

2 Capturing Value

- 아래 예시를 보면서 이해해보자.

var count = 0;

let incrementer = {
    count += 1;
}

incrementer()
incrementer()
count

- incrementer는 자기의 scope를 벗어난 변수에 접근을 하고 있다.

- 원래대로라면 scope를 벗어난 변수는 참조할 수 없지만 이 변수를 closure로 capture하면 스코프를 벗어나도 변수의 값을 사용하고 변경할 수 있다.

 

728x90
반응형