관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] (프로퍼티) Stored property vs Computed property vs Type property 본문

swift 5 문법

[iOS - swift] (프로퍼티) Stored property vs Computed property vs Type property

jake-kim 2021. 6. 16. 01:55

Stored Property

  • 정의: class, struct에서 instantce의 일부로 저장되는 상수(let) 또는 변수(var)
  • default 값 또는 init을 사용하여 값 할당
  • lazy property: 해당 property가 사용될 때 초기화
    • let으로 선언 불가: let은 초기화가 완료 되기 전에 항상 값을 가져야 하므로
    • property의 초기 값이 인스턴스의 초기화가 오나료 될 때까지 알 수 없는 외부 요인에 의존할 때 사용
    • property의 초기 값에 복잡하거나 계산 비용이 많이 드는 설정이 필요할 때 or 필요할 때까지 수행해서는 안되는 경우에 사용
    • lazy 주의 사항: lazy property는 여러 스레드에서 동시에 접근되고, 아직 초기화 되지 않은 경우 한 번만 초기화 된다는 보장이 없으므로 주의

Computed Property

  • 실제로 값을 저장하지 않고 간접적으로 다른 property를 연산하여 getter, setter 제공
// 예제 참고: swift documentation

struct Point {
    var x = 0.0, y = 0.0
}
struct Size {
    var width = 0.0, height = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}
  • set에 이름을 따로 지정하지 않을 경우, "newValue"로 사용
  • get 키워드를 쓰지 않으면 자동으로 '읽기 전용' computed property로 사용

 

Property observer

  • willSet(oldValue), didSet(newValue)
  • stored property의 한 종류: 초기값이 없으면 컴파일 에러가 나므로, 초기값이 있기 때문에 stored property의 한 종류

ex) 초기값이 없으면 컴파일 에러가 발생 - computed property가 아닌 stored property

ex) 초기값을 넣어서 정상적으로 property observer 사용

    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }

Type Property

  • static을 이용하여 property를 표현
struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}

* 참고

https://docs.swift.org/swift-book/LanguageGuide/Properties.html

Comments