[Swift] Closure - 1 (Basic)

728x90

클로저

클로저란 특정 기능을 담은 코드를 블럭으로 모아둔 형태이자, 일급 객체로 완벽한 역할을 할 수 있습니다.
일급 객체란 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수도 있습니다. 실제 우리가 알고 있는 함수는 클로저의 한 형태로, 이름이 있는 클로저입니다.

 

기본 형태

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

 

Basic Closure

let simpleClosure = {
  print("This is SimpleClosure!!")
}
simpleClosure()

let closureParameter = { (str: String) -> Int in
  return str.count
}
let count = closureParameter("Swift")
print(count)

func voidFunction() {
  print("1")
}
let var1 = voidFunction
let var2: ()->() = {
  print("1")
}
var1()
var2()

 

Inline Closure

let add: (Int, Int) -> Int
add = { (a: Int, b: Int) -> Int in
    return a + b
}
add(3,5) // 8

func calculate(a: Int, b: Int, completion: (Int, Int) -> Int) -> Int {
    return completion(a,b)
}

calculate(a: 10, b: 50, completion: add) // 60

var calcValue = calculate(a: 20, b: 30, completion: { (left: Int, right: Int) -> Int in
    return left * right
})
print(calcValue) // 600

 

Trailing Closure

클로저가 메서드의 마지막 전달 인자일때 마지막 매개변수 이름을 생략한 후 소활호 메서드 소괄호 외부에 클로저를 구현할 수 있습니다.

위의 Inline Closure에서 calculate를 Trailing Closure로 만들어 보겠습니다.

//Inline Closure
calculate(a: 20, b: 30, completion: { (left: Int, right: Int) -> Int in
    return left * right
})

//Trailing Closure
calculate(a: 10, b: 20) { (left, right) -> Int in
    return left * right
}

단축 인자이름을 활용할 수 있습니다
단축 인자이름은 클로저의 매개변수의 순서대로 $0, $1, $2... 처럼 표현해서 사용할 수 있습니다.

//컴파일러가 타입을 알고 있기 때문에 단축 인자 이름을 활용할 수 있습니다.
calculate(a: 10, b: 20) {
    return $0 * $1
}

//컴파일러가 리턴 타입을 알고 있기 때문에
//암시적 반환 표현으로 return을 쓰지 않고 암시적으로 반환을 취급합니다.
calculate(a: 10, b: 20) {
    $0 * $1
}

calculate(a: 10, b: 20) { $0 * $1 }

 

이해를 위해 클로저 단축 문법을 살펴보겠습니다.

 

Syntax Optimization

func performClosure(param: (String) -> Int) {
    print(param("swift"))
}

performClosure(param: { (str: String) -> Int in
    return str.count
})

performClosure(param: { (str: String) in
    return str.count
})

performClosure(param: { str in
    return str.count
})

performClosure(param: {
    return $0.count
})

performClosure(param: {
    $0.count
})

performClosure(param: ) {
    $0.count
}

performClosure() {
    $0.count
}

performClosure { $0.count }

 

'Swift' 카테고리의 다른 글

[Swift] Closure - 3 (NoEscaping, Escaping, AutoClosure)  (0) 2019.07.22
[Swift] Closure - 2 (Capturing)  (0) 2019.07.22
[Swift] 옵셔널(Optionals)  (0) 2019.07.22
[Swift] 접근제어(Access Control)  (0) 2019.07.20
[Swift] 프로퍼티(Property)  (0) 2019.07.19