Closure

Martin·2023년 2월 18일

TIL 아카이브

목록 보기
6/11

클로저란?

  • 전역 함수 : 이름이 있고 어떤 값도 캡쳐하지 않는 클로저
  • 중첩 함수 : 이름이 있고 관련한 함수로 부터 값을 캡쳐 할 수 있는 클로저
  • 이름 없는 클로저

클로저 축약

  • 컨텍스트에서 파라미터와 반환값 타입 유추
  • 단일 표현식 클로저의 암시적 반환
  • 약식 인자 이름
  • 후행 클로저 구문

함수를 클로저로 표현 예시

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

func red(name: String) -> String {
    return name
}

red(names[0])
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

var red = { (name: String) -> String in
    return name
}

red(names[0])

func red(_ a: Int, _ b: Int) -> Bool {
    return a > b ? true : false
}
let red = { (a: String, b: String) -> Bool in
    return a > b ? true : false
}

클로저 축약 예시

var reversedNames = names.sorted(by: red)
  • 컨텍스트에서 파라미터와 반환값 타입 유추
func red(name: String) -> String {
    return name
}

var reversedNames = names.sorted(by: { (a, b) in
    return a > b
}
  • 단일 표현식 클로저의 암시적 반환
var reversedNames = names.sorted(by: { (a, b) in a > b } )
  • 약식 인자 이름
var reversedNames = names.sorted(by: { $0 > $1 } )
  • 후행 클로저 구문
var reversedNames = names.sorted { $0 > $1 }

func doAnything(_ s1: String, _ s2: String) -> String {
    return s1 + s2
}
names.reduce("") { $0 + $1 }

map 뒤에도 클로저로 사용 가능

let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]
let strings = numbers.map { (number) -> String in
    var number = number
    var output = ""
    repeat {
        output = digitNames[number % 10]! + output
        number /= 10
    } while number > 0
    return output
}
profile
제로부터 시작하는 이세계 Swift

0개의 댓글