-
[TIL w2d5] Swift 복습 (Enum, Property 🌺)iOS💖 2025. 3. 17. 16:36
학습 목표
Enum, Property를 iOS 개발에 실제 활용할 수 있도록 학습!
문법의 특징을 잘 파악해보자!
Enum 💗
: 다양한 상황(주제/종류) 그룹화 & 효율적 처리- 특정 주제나 종류에 따라 묶을 수 있는 값들을 그룹화하여, 데이터 타입으로 사용할 수 있다.
- 타입 안정성을 보장, 의도를 명확하게 파악 가능!
- 저장 프로퍼티 사용 X
[1] Enum Associated Value
enum DeliverySataus { case ordered case shipping(trakingNumber: String) // associated value case deliverCompleted(date: String) // associated value } let status = DeliverySataus.shipping(trakingNumber: "8001-12234") switch status { case .ordered: print("주문완료!") case .shipping(let trackingNumber): print("배송중! 송장번호: \(trackingNumber)") case .deliverCompleted(let date): print("배송완료! 배송일: \(date)") }[2] Enum Raw Value
[2.1] Stringenum Season: String { case spring = "봄 입니다" case summer // raw value: "summer" case autum case winter } let season: Season = .spring print(season) // spring print(season.rawValue) // 봄 입니다 let season2 = Season.summer print(season2.rawValue) // summer var newSeason = Season(rawValue: "autum") // rawValue에는, Season enum 에 실제 존재하는 case의 rawValue을 넣어야 한다. print(newSeason) // tional(Page_Contents.Season.autum) newSeason = Season(rawValue: "autuuum") // enum Season에 autuuum 이라는 case X print(newSeason) // nil[2] Enum Raw Value
[2.2] 숫자형// rawValue 를 하나만 정해줄 경우, 아래로 순서에 따라 +1만큼 rawValue값이 올라간다. enum Month: Int { case january = 1 // 1을 주지 않았다면, 자동 0으로 할당됨 case februray case march case april = 10 case may // 11 case june // 12 case july // 13 case august // 14 case september // 15 case october // ... case november case december } print(Month.februray.rawValue) // 2 print(Month.june.rawValue) // 12 print(Month(rawValue: 15)) // Optional(Page_Contents.Month.september)[3] Enum Function
enum SeasonFunction: String { case spring case summer case autum case winter func weather() -> String { switch self { case .spring: return "따뜻해요" case .summer: return "더워요" case .autum: return "쌀쌀해요" case .winter: return "추워요" } } } // 🔴 사용 🔴 let seasonFunc = SeasonFunction.spring print(seasonFunc.weather()) // 따뜻해요Class deinit
: 자동 호출됨 (O) , 직접 호출 불가! (X)deinit : 종료된 instance가 메모리에서 해제될때 자동호출됨! 직접 호출 불가
Property 🌺
: 저장 (+ lazy) / 연산 / 타입 Property , Property Observer[1] 저장 프로퍼티
enum에서 저장프로퍼티 사용 불가
struct Person { var name: String // 값을 저장하는 저장 프로퍼티 var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티 }[2] 지연 저장 프로퍼티 (lazy)
- 처음 실제로 사용하기 전까지, 메모리에 값을 저장하지 않음!
- ➡️ 사용 전까지 메모리 효율 높일 수 있음!
- ➡️ 사용 전까지 메모리 효율 높일 수 있음!
- 사용
- lazy var 프로퍼티이름
- var 만 사용 가능!
- 저장 프로퍼티 사용할 수 있는 class, struct 등 에서 사용
class Person { var name: String = "A" var age: Int = 15 lazy var height = 175.7 } let person = Person() // 🔴 Person의 height값에 접근하지 않았기 때문에 아직 메모리에 할당되지 않은 상태 print(person.height) // height값을 사용하기 때문에 🔴 이제 메모리에 할당하여 사용함.[3] 연산 프로퍼티
- 값 저장 X, 계산된 값을 제공
- 사용
- class, struct, enum
- var 만 사용 가능!
- get, set 키워드로 getter, setter 구현
- getter 필수!
- setter 생략 가능! ➡️ get 키워드 생략 가능
[3.1] Getter와 Setter 모두 있는 연산 프로퍼티
// [1] Getter와 Setter 모두 있는 연산 프로퍼티 struct Person { var name: String var age: Int var isAdult: Boole { get { return age >= 20 } set { if newValue == true { age = 20 } else { age = 19 } } } } var person = Person(name: "Dove", age: 100) print(person.isAdult) // true person.isAdult = false print(person.age) // 19[3.2] Setter 가 구현하지 않은 연산프로퍼티
// [2] Setter 가 구현하지 않은 연산프로퍼티 struct Person { var name: String var age: Int = 0 var isAdult: Bool { get { return age >= 20 } } } var person = Person(name: "Dove", age: 100) print(person.isAdult) // true person.isAdult = false // compile error !! (no setter)[3.3] Setter가 구현되지 않았을 때는 get 키워드를 생략
// [3] Setter가 구현되지 않았을 때는 get 키워드를 생략 struct Person { var name: String var age: Int = 0 var isAdult: Bool { return age >= 20 } }[4] 타입 프로퍼티
- 모든 instance 가 공유하는 프로퍼티
- ➡️ instance 만들지 않고, 타입 자체에서 접근!
- static 키워드 사용 : class, struct, enum
[4.1] struct 에서 사용
struct Person { static var structName = "Person" func logStructName() { print(Person.structName) // 🔴 내부에서는 Self로 사용 가능 } } var person = Person() person.logStructName() // Person Person.structName = "Changed!" person.logStructName() // Changed print(Person.structName) // Changed
[4.2] enum 에서 사용 🔴enum Season: String { case spring case summer case autumn case winter static var enumName = "Season" } Season.enumName // "Season"[5] 프로퍼티 Observer
- 저장 프로퍼티의 값이 변경되는 것을 감시하고 있다가, willSet / didSet 코드블록을 실행
- 사용 : 저장 프로퍼티가 사용 가능한, struct / class
- willSet
- 값 변경 전 호출
- willSet { }
- 변경될 값은 newValue 키워드를 통해 접근 가능!
- willSet(이름) { }
- 매개변수 이름으로 접근
- didSet
- 값 변경 후 호출
- didSet { }
- 변경되기 전의 값은 oldValue 키워드를 통해 접근 가능!
- didSet(이름) { }
- 매개변수 이름으로 접근
[5.1] 기본 사용 방법
struct Person { var name: String { willSet { print("Person의 name이 변경될 예정입니다. 변경될 값은 \"\(newValue)\" 입니다.") } didSet { print("Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.") print("\(oldValue) -> \(name)") } } var age: Int } var person = Person(name: "Dove", age: 10) person.name = "Dove2" // Person의 name이 변경되어 didSet 코드블록이 호출되었습니다. // Dove -> Dove2[5.2] newValue, oldValue 다른 이름으로 변경해서 사용 🔴
struct Person { var name: String { willSet(changeNewName) { // 🔴 print("Person의 name이 변경될 예정입니다. 변경될 값은 \"\(changeNewName)\" 입니다.") } didSet(beforeName) { // 🔴 print("Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.") print("\(name) -> \(beforeName)") } } var age: Int }'iOS💖' 카테고리의 다른 글
[TIL w3d4] Swift 심화문법 CLI 프로젝트 (Feat. 👩🏻🔧트러블 슈팅) (0) 2025.03.20 [TIL w3d1] Swift 복습 (Optional, 중첩타입, 접근제어자, Protocol) (0) 2025.03.17 [TIL w2d4] Swift CLI 숫자 야구게임 (Feat. 🛠️트러블 슈팅) (0) 2025.03.14 [TIL w2d3] 알고리즘 Swift로 다시시작 / Swift 복습 (Struct) (0) 2025.03.13 [TIL w2d2] 알고리즘 특강 / 야구 게임 만들기 (Lv. 1~3 / 6) (0) 2025.03.11