[iOS-Swift] 기초 문법 개인 과제 최최최종_리팩토링.swift

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