ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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] String

    enum 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
    }

     

     

     

     

    댓글

Designed by black7375.