Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- tableView
- swiftUI
- RxCocoa
- 리펙터링
- 스위프트
- Clean Code
- Refactoring
- UICollectionView
- map
- MVVM
- combine
- uitableview
- UITextView
- collectionview
- HIG
- Xcode
- Human interface guide
- ios
- SWIFT
- 애니메이션
- Observable
- 클린 코드
- clean architecture
- ribs
- rxswift
- Protocol
- 리펙토링
- swift documentation
- uiscrollview
- 리팩토링
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift 공식 문서] 10. Properties (프로퍼티) 본문
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에는 적용 불가 (지역 변수로만 사용 가능)
'swift 공식 문서' 카테고리의 다른 글
[iOS - swift 공식 문서] 12. Subscripts (0) | 2021.07.03 |
---|---|
[iOS - swift 공식 문서] 11. Methods (메서드) (0) | 2021.06.29 |
[iOS - swift 공식 문서] 9. Structures and Classes (0) | 2021.06.25 |
[iOS - swift 공식 문서] 8. Enumerations (열거형) (0) | 2021.06.24 |
[iOS - swift 공식 문서] 7. Closure (클로저) (0) | 2021.06.24 |
Comments