상현에 하루하루
All 개발자의 하루

스위프트 입문 4일차

( 업데이트: )

클로저

코드에서 전달 및 사용할 수 있는 독립 기능 블록이며, 일급 객체의 역할을 할 수 있음
일급 객체란?
전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수 도 있다.

/*
{ (매개 변수) -> 리턴 타입 in
  실행 구문
}
*/

let hello = { () -> () in
    print("hello")
}

hello()  // hello

let hello2 = { (name: String) -> String in
    return "Hello, \(name)"
}

hello2(name: "Gunter")  // error
hello("Gunter") // ✅

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

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

반환 타입

func doSomething2() -> () -> () {
    return { () -> () in
        print("hello4")
    }
}

doSomething()()
doSomething() {
    print("hello2")
}
doSomething {
    print("hello2")
}
func doSomething2(success: () -> (), fail: () -> ()) {
}

doSomething2 {
} fail: {
}

문법 간소화

doSomething3(closure: (Int, Int, Int) -> Int) {
    closure(1,2,3)
}

doSomething3(closure: { (a, b, c) in
    return a+b+c
})

doSomething3(closure: {
    return $0+$1+$2
})

doSomething3(closure: {
    $0+$1+$2
}

doSomething3 {
    $0+$1+$2
}

고차함수

다른 함수를 전달 ㅇ니자로 받거나 함수 실행의 결과를 함수로 반환하는 함수

  • map
  • filter
  • reduce

map

let numbers = [0,1,2,3]
let mapArray = numbers.map { (number) -> Int in
    return number * 2
})

filter

let intArray = [10, 5, 20, 13, 4]
let filterArray = intArray.filter { $0 > 5 }
print("filter \(filterArray)")  // filter [10, 20, 13]

reduce

let someArray = [1,2,3,4,5]
let reduceResult = someArray.reduce(0) {
    (result: Int, element: Int) -> Int in
    print("\(result) + \(element)")
    return result + element
}

print("reduce \(reduceResult)")