단순히 Class, Struct, Value 등을 저장할 수 있는 기능
가장 일반적인 기능
//기본 var, let
struct FixedLengthRange {
//수정 가능
var firstValue: Int
// 수정 불가능
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
rangeOfThreeItems.firstValue = 6
lazy로 선언을 하게되면 호출 전까지는 생성을 하지 않는다.
상황에 따라서 조건부로 사용되거나 꼭 init 시점에 호출이 필요가 없다면,
적당히 사용한다면 불필요한 리소스를 사용을 줄일 수 있다.
생각보다 lazy로 선언이 될 수 있는 내용들이 꽤 많다.
그리고 init시점에 다른 Property를 필요로 한다면 lazy를 쓸 수도 있다.
let initValue = Value()
lazy var lazyValue = Value()
//아래와같이 호출이 이루어질때 생성이 된다.
print(lazyValue)
Stored Properties는 단순 저장을 목적으로 했다면 이 녀석은 특정 상태에 따른 연산을 목적으로 하는 Property
코드로 보자
//단순한 예시
struct CompactRect {
private var _ origin = Point()
var size = Size()
var center: Point {
get {
//한줄 표현일 경우 return 생략 가능
Point(x: origin.x + (size.width / 2),
y: origin.y + (size.height / 2))
}
//새로 들어오는 값은 newValue로 들어와 생략이 가능
set(newValue) {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
//읽기 전용
//get만 정의하게되면 자동으로 읽기전용이 된다.
//그럴경우 get도 생략가능
struct CoordinatePoint {
var x: Int
var y: Int
var oppositePoint: CoordinatePoint {
get{
return CoordinatePoint(x: 10, y: 20)
}
}
//또는 get을 생략하여 바로 사용할 수 있다.
var oppositePoint: CoordinatePoint {
return CoordinatePoint(x: 10, y: 20)
}
}
아니 잠깐만 저거 근데 왜 필요해?
함수를 구현해서도 사용가능한거잖아?
라고 생각을 했었습니다.
공식 문서에는 그에 대한 언급은 없었습니다.
근데 좀 찾아보니까 get set으로 함수 두개 만들래?
아 ㅇㅋ.. 납득해버렸습니다.
특정 값을 가져오는 과정에서 편하게 사용하실 수 있습니다.
특정 property에 값이 변경될 예정이거나 변경되었을 때 호출되어 시점에 따라 액션을 취할 수 있는 기능.
크게 어려운 내용은 아니라서 코드로 마무리 한다.
var credit: Int = 0 {
//값이 변경되기 전
//set 처럼 newValue 수정 또는 생략가능
willSet(newValue) {
print("잔액이 \(credit)에서 \(newValue)원으로 변경될 예정입니다.")
}
//값이 변경된 후
//set 처럼 oldValue 수정 또는 생략가능
didSet(oldValue) {
print("잔액이 \(oldValue)에서 \(credit)으로 변경되었습니다.")
//아래처럼 값이 저장이 됐을때 ui를 업데이트하는 등 상황에서 유용
uiUpdate()
}
}
Swift 5.1 에서 새로 추가된 기능
get/set에 들어가는 내용들이 반복적인 코드를 활용하는 상황에서 유용하게 사용될 수 있다.
미리 get/set 시점의 구현되는 로직들을 별도의 struct, enum, class 등으로 구현을 해 property선언 시점에 명시하는 방식으로 간단하게 구현 할 수 있다.
사용방법은 아래와 같다.
새롭게 swift에 반영된 기능으로 실제 사용사례나 적합한 사용시점은 조금 더 공부를 해봐야 알 것 같다. (나중에 보니까 Swift UI에서 사용되는 것 같다. Swift UI 학습시에 함께 보아야겠다)
//property wrapper를 사용하기 위해서는 꼭 아래와 같이 number와 wrappedValue 를 구현
//projectedValue는 선택적으로 더 많은 정보를 제공하기 위해 사용되는 값
@propertyWrapper
struct SmallNumber {
//실제 사용되는 값
private var number = 0
//해당 property에서 값의 조정여부를 알기 위한 목적으로 반영됨
var projectedValue = false
//아래 wrappedValue의 get/set을 구현
var wrappedValue: Int {
get { return number }
set {
if newValue > 12 {
number = 12
projectedValue = true
} else {
number = newValue
projectedValue = false
}
}
}
}
//property wrapper를 사용하는 방법
struct SomeStructure {
@SmallNumber var someNumber: Int
}
var someStructure = SomeStructure()
//$를 통해 projectedValue에 접근할 수 있음
// 12보다 작으므로 조정이 필요없어 projectedValue는 false
someStructure.someNumber = 4
print(someStructure.$someNumber)
// Prints "false"
//12 보다 큰 수가 할당되어 set과정에서 projectedValue가 true가 됨
someStructure.someNumber = 55
print(someStructure.$someNumber)
// Prints "true"
#학습에 대한 내용으로 틀린 내용이 있을 수 있습니다.
#댓글로 남겨주시면 더 좋은 게시글로 수정하도록 하겠습니다.