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에는 적용 불가 (지역 변수로만 사용 가능)