TIL 15일 차 - Swift 문법 기초 문법 개인 과제 최종 리팩토링

첫 번째
타입 추론.
// 기존 코드 (수정 전)
let sum: (Int, Int) -> String = {(a: Int, b: Int) -> String
in "두 수의 합은 \(a + b) 입니다." // return 생략
}
-> 총 3단계로 나누어서 코드 리팩토링
// 1단계: sum의 타입을 이미 왼쪽에서 알고 있으므로
// 클로저 안의 반환 타입 -> String은 생략 가능
let sum: (Int, Int) -> String = { (a: Int, b: Int) in
"두 수의 합은 \(a + b) 입니다."
}// 2단계: 파라미터의 타입(Int) 제거
let sum: (Int, Int) -> String = { (a, b) in
"두 수의 합은 \(a + b) 입니다."
}// 3단계: 파라미터의 이름 제거 ($0, $1)
// 한줄짜리 클로저 + 간단한 로직이면 축약 인자 이름이 사용 가능하다.
let sum: (Int, Int) -> String = {
"두 수의 합은 \($0 + $1) 입니다."
}
두 번째
프로퍼티 옵져버.
// 기존 코드 (수정 전)
var name: String {
// 프로퍼티 옵져버
willSet {
if newValue != name {
print("name 변경 알림")
print("변경 이전 값: \(name)") // self.name과 name은 같은 값임
print("변경 이후 값: \(newValue)")
} // willset은 자동으로 값이 대입되므로 newValue = self.name 필요없음 (수정)
}}
내가 쓴 것처럼 willSet 로직에 문제가 있진 않다. 하지만 일반적으로 값이 변경된 직후의 결과를 알릴 때는 didSet을 쓴다고 한다.
그 이유는 뭘까..????
1. 일단 사람이 읽기에도 직관적임
// 예시 코드
didSet {
print("변경 이전 값: \(oldValue)") // 진짜 이전의 값임
print("변경 이후 값: \(name)") // 이미 새 값임
}
2. 로깅 / 알림 / UI 업데이트에 최적화되어있음
didSet은 보통
- 값 변경 알림
- UI 갱신
- 로그 출력
- 상태 동기화
등의 용도에 사용하는데 내가 쓰려던 코드의 목적인 이름(값) 변경 알림에 적합하다.
따라서 최종 수정한 코드는 다음과 같다.
var name: String {
// 프로퍼티 옵져버
didSet { // 값이 변경되었음을 알릴때는 willSet보다 didSet이 적합함
if oldValue != name {
print("name 변경 알림")
print("변경 이전 값: \(oldValue)")
print("변경 이후 값: \(name)")
}
}
}
마지막에 순환참조에 관한 문제는 다음 블로그글에 풀이해 정리해 두었다.
https://coduhee.tistory.com/85
[iOS] ARC 순환참조 해제 문제
TIL 15일 차 - Swift 문법 ARC 순환참조 해제 문제클래스 A, B 사이에 순환참조가 발생하도록 구현해 주세요.각 클래스에 deinit 을 정의하여, 메모리 해제 여부를 확인할 수 있도록 해주세요.먼저 서로
coduhee.tistory.com
'iOS > Swift ' 카테고리의 다른 글
| [iOS-Swift] 심화 문법 문제 - 숫자 야구 게임 (0) | 2026.01.18 |
|---|---|
| [iOS-Swift] 스위프트에서 문자열 뒤집기 + reduce (0) | 2026.01.16 |
| [iOS-Swift] 에러처리 (0) | 2026.01.14 |
| [iOS] ARC 순환참조 해제 문제 (0) | 2026.01.14 |
| [iOS-Swift] 객체 지향 프로그래밍 OOP (0) | 2026.01.14 |