Day 6 ~ Day 7 : 클로저

sun·2021년 9월 15일
0

100 Days of SwiftUI

목록 보기
3/11

[Day 6]   [Day 7]

@ Day 6

# 클로저

let driving = {
    print("I'm driving in my car")
}

driving()  // I'm driving in my car

매개변수만 있는 클로저

  • 클로저 호출 시에는 매개변수 이름 생략
  • in 으로 매개변수와 body 구분
let driving = { (place: String, vehicle: String) in
    print("I'm going to \(place) by \(vehicle)")
}

driving("London", "car")  // I'm going to London by car

리턴 값만 있는 클로저

let sayHello = { () -> String in
    return "Hello"
}

print(sayHello())  // Hello

매개변수와 리턴 값이 있는 클로저

let driving = { (place: String, vehicle: String) -> String in
    return "I'm going to \(place) by \(vehicle)"
}

print(driving("London", "car"))  // I'm going to London by car

# 매개변수로써의 클로저

  • 함수의 매개변수 자리에
    name: (closureParmeterType) -> closureReturnType 형식으로 작성
let driving = {
    print("I'm driving")
}

func travel(action: () -> Void) {
    print("All set")
    action()
    print("Arrived")
}

travel(action: driving)

# Trailing closure syntax

  • 함수의 마지막 매개변수가 클로저일 때 매개변수 이름을 생략 하고 괄호 내부에 클로저 매개변수를 선언 하는 방식으로 함수 호출 가능
func animate(duration: Double, animations: () -> Void) {
    print("Starting a \(duration) second animation...")
	animations()
}

// trailing closure syntax
animate(duration: 3) {
    print("Fade out the image")
}

// 기존 방식
animate(duration: 3, animations: {
    print("Fade out the image")
})
  • 함수의 매개변수가 클로저 하나뿐일 때는 호출 시 () 도 생략 가능
func travel(action: () -> Void) {
    print("All set")
    action()
    print("Arrived")
}

travel{
    print("I'm driving")
}

@ Day 7

# 매개변수로써의 클로저 : 특수 케이스

매개변수를 갖는 클로저

func travel(action: (String) -> Void) {
    print("Ready to go")
    action("London")
    print("Arrived")
}

travel { (place: String) in
    print(I'm going to \(place) in my car")
}
  • 클로저 매개변수를 $number 형태의 shorthand name으로 축약 가능
    b/c : (클로저를 매개변수로 갖는) 함수에서 클로저의 매개변수와 리턴 값의 타입을 지정했으므로 타입 추론 가능
  • 위의 코드를 아래와 같이 작성 가능
func travel(action: (String) -> Void) {
    print("Ready to go")
    action("London")
    print("Arrived")
}

travel {
    print(I'm going to \($0) in my car")
}

매개변수와 리턴 값을 갖는 클로저

func travel(action: (String) -> String) {
    print("Ready to go")
    let description = action("London")
    print(description)
    print("Arrived")
}

travel { (place: String) -> String in
    return "I'm going to \(place) in my car"
}

# 복수의 매개변수를 갖는 클로저

func travel(action: (String, Int) -> String) {
    print("Ready to go")
    let description = action("London", 60)
    print(description)
    print("I arrived")
}

travel {
    "I'm going to \($0) at \($1) miles per hour"
}

# 클로저를 리턴하는 함수

  • 함수의 리턴 값을 쓰는 부분에
    (closureParameterType...) -> (closureReturnType)
    와 같이 작성해 클로저를 리턴하는 함수임을 표현
func travel() -> (String) -> Void {
    return {
        print(I'm going to \($0)")
    }
}

let result = travel()
result("London")  // I'm going to London

# Capturing values

  • 클로저 내부에서 외부 변수를 이용하면 (해당 클로저를 호출한 함수가 종료되더라도) 해당 변수의 값이 보존
func travel() -> (String) -> Void {
    var counter = 1
	return {
        print("\(counter). I'm going to \($0)")
        counter += 1  // counter 가 capture 됨
    }
}

result("London")  // 1. I'm going to London
result("London")  // 2. I'm going to London
result("London")  // 3. I'm going to London
profile
☀️

0개의 댓글