소피it블로그

[Swift] 100 Days of Swift - Day 7 정리 본문

개발_iOS/스위프트

[Swift] 100 Days of Swift - Day 7 정리

sophie_l 2022. 3. 27. 15:28

https://www.hackingwithswift.com/100/7

 

Day 7 – 100 Days of Swift

Follow the 100 Days of Swift and learn to build apps for free.

www.hackingwithswift.com

퀴즈 자꾸 12문제씩 내서 짜증도 났는데, 풀다 보니 그래도 개념 익히기에 도움이 많이 되는 것 같아서 그럭저럭 만족 중이다.

클로저 개념 이해하는 게 엄청 수월하지는 않아서 뜯어보면서 찬찬히 익히는 중.

 

⭐️ 1. 파라미터가 있는 클로저를 파라미터로 받는 경우

func morning(action: (String) -> Void) {
	print("It's a new day. I need to get ready.")
	action("toast")
	print("I'm ready")
}

morning { (food: String) in
	print("I'm having \(food) as breakfast.")
}

지난 6일차의 마지막 부분과 연결되는 것 같은데, morning 함수의 마지막 파라미터가 action이라는 클로저이기 때문에 action을 morning의 인수로 주지 않고 함수의 { } 부분에 바로 써줄 수 있다. 그런데 이 경우 action 클로저 자체에서 스트링을 인수로 받기 때문에 이 또한 { } 안에 in과 함께 적어주는 것.

 

⭐️ 2. 리턴값이 있는 클로저를 파라미터로 받는 경우

func morning(action: (String) -> String) {
	print("It's a new day. I need to get ready")
	let description = action("toast")
	print(description)
	print("I'm ready")
}

morning { (food: String) -> String in
	return "I'm having \(food) as breakfast."
}

// in 앞에 화살표와 클로저의 리턴값의 타입을 명시해주면 된다.

⭐️ 3. 클로저에서 생략 가능한 것들

morning { food in
	"I'm having \(food) as breakfast."
}

스위프트는 morning의 인수로 들어오는 action의 인수와 리턴값이 둘 다 스트링이라는 것을 알기 때문에 생략할 수 있게 해준다. 게다가 실행문이 한 줄 밖에 없는 경우이기 때문에 그게 바로 리턴값이라는 것도 추론하여 리턴 키워드까지 생략하게 해준다. 이마저도 더 간단하게 $0, $1 등의 기호를 통해 나타낼 수 있다.

morning {
	"I'm having \($0) as breakfast."
}

func morning(action: (String, Int) -> String) {
	print("It's a new day. I need to get ready.")
	let description = action("toast", 2)
	print(description)
	print("I'm ready.")
}

morning {
	"I'm having \($0) of \($1) for breakfast."
}

4. 함수의 리턴값이 클로저인 경우

func morning() -> (String) -> Void {
	return {
		print("I'm having \($0) for breakfast.")
	}
}

let result = morning()
result("toast")

1) morning 함수의 리턴 값이 클로저인데, 2) String을 인수로 받아 Void를 반환하는 클로저라는 의미. 이하와 같이 작성해줄 수도 있지만 추천되는 방법은 아니다.

let result2 = morning()("toast")

5. 외부 변수와 함께 쓰기

func morning() -> (String) -> Void {
	var counter = 1
	return {
		print("\(counter). I'm having \($0) for breakfast")
		counter += 1
	}
}

let result = morning()
result("toast")
result("toast")
result("toast")

// 이 경우 counter도 계속 갱신됨