관리 메뉴

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

[iOS - swift 공식 문서] 10. Properties (프로퍼티) 본문

swift 공식 문서

[iOS - swift 공식 문서] 10. Properties (프로퍼티)

jake-kim 2021. 6. 26. 14:11

Properties

  • 내부에 property가 var로 선언되어도, copy of value인 struct는 인스턴스를 let으로 할 경우 변경 불가

  • 내부에 property가 var로 선언되고, reference of value인 class는 인스턴스를 let으로 할 경우 변경 가능

Lazy stored property

  • 상수 속성은 초기화가 완료되기 전에 항상 값을 가져야 하므로 lazy 선언 불가

ex) 불필요한 초기화를 피하기 위해 lazy stored property 사용

class DataImporter {
    var filename = "data.txt"
}

class DataManager {
    lazy var importer = DataImporter()
    var data: [String] = []
}

let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")

// lazy가 불리는 시점
manager.importer.filename

Stored Property vs Computed Property

  • Computed Property
    • 실제 값을 저장하지 않는 프로퍼티
    • 초기화 값이 존재하지 안는 프로퍼티
    • getter, setter 제공
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)
        }
    }
}
  • 읽기전용 Computed Property: getter가 있지만 setter가 없는 computed property
    • get, set 키워드 생략되고 값을 return만 하는 형태
struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
        return width * height * depth
    }
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
  • Stored Property
    • 실제 값을 저장하는 프로퍼티
    • 초기화 값이 존재하는 프로퍼티
    • willSet(newValue), didSet(oldValue) 존재
class Test {
    var value: Int = 3 {
        willSet {
            print(newValue)
        }
        didSet {
            print(oldValue)
        }
    }

    var value2: Int {
        didSet {
            print(oldValue)
        }
    }

    init(value2: Int) {
        self.value2 = value2
    }
}

Property Wrapper

  • Property를 wrapping하는 기법
    • 특정 property를 한번 더 감싼다음 특정 기능 부여
    • 특정 property를 접근할 때, 지정된 computed property가 불리는 것
  • Property를 정의하는 struct, enum, class에 wrappedValue를 추가
    • wrappedValue는 computed property
  • property wrapper 정의
@propertyWrapper
struct TwelveOrLess {
    private var number = 0
    var wrappedValue: Int {
        get { return number }
        set { number = min(newValue, 12) }
    }
}
  • property wrapper 사용
    • struct, enum, class 이름을 @주석을 사용하여 프로퍼티 선언
struct SmallRectangle {
    @TwelveOrLess var height: Int
    @TwelveOrLess var width: Int
}

var rectangle = SmallRectangle()
rectangle.height = 24 
print(rectangle.height) // 12
  • @주석을 사용하지 않고 명시적으로 property wrapper 접근
struct SmallRectangle {
    private var _height = TwelveOrLess()
    private var _width = TwelveOrLess()
    var height: Int {
        get { return _height.wrappedValue }
        set { _height.wrappedValue = newValue }
    }
    var width: Int {
        get { return _width.wrappedValue }
        set { _width.wrappedValue = newValue }
    }
}
  • Property wrapper는 전역 변수나 computed property에는 적용 불가 (지역 변수로만 사용 가능)

 

Comments