연산 프로퍼티 getter / setter
Computed Property 연산 프로퍼티
- 클래스, 구조체, 열거형에서 사용 가능
var
로 선언해야 함- 클래스, 구조체, 열거형에 값을 저장할 저장 프로퍼티가 반드시 하나 있어야 함
get
,set
을 동시에 구현 가능하고, 읽기 전용으로get
만 구현 가능set
의 매개변수를 생략한다면 반드시newValue
키워드를 사용해야 함- 직접적인 값을 저장하지 않고 값을 연산한 결괏값
- 특정 타입의 인스턴스에 사용되는 것을 뜻함
실제 값을 저장하는 프로퍼티가 아니라, 그때그때 값을 연산하고 값을 돌려주는 접근자 역할 또는 내부 프로퍼티 값을 간접적으로 설정하는 설정자 역할을 함.
클래스, 구조체, 열거형은 저장 프로퍼티 이외에도 값을 저장하지 않는 연산 프로퍼티를 정의할 수 있는데, 바로 getter
와 setter
를 통해 다른 프로퍼티와 간접적으로 값을 검색하고 세팅한다.
struct CoordinatePoint {
var x: Int = 1
var oppositePoint: CoordinatePoint { //연산 프로퍼티
get { //접근자
return CoordinatePoint(x: -x)
}
set(oppsite) { //설정자
x = -oppsite.x
}
}
}
var SeogunPosition: CoordinatePoint = CoordinatePoint()
print(SeogunPosition) // x: 1
print(SeogunPosition.oppositePoint) //x: -1
// 설정자 x = -oppsite.x이기 때문에 접근 가능
// 대칭 좌표를 20 으로 설정하면
SeogunPosition.oppositePoint = CoordinatePoint(x: 20)
// 현재 좌표는 -20 으로 설정된다
print(SeogunPosition) // x: -20
oppositePoint
는 x
에 대해 '연산'을 한다. 만약 값을 읽으려고 하면 x
에 있는 값을 리턴하고, 값을 지정할 때는 x
에 -
를 붙여 x
에 저장하게 된다.
중요한 점은 연산 프로퍼티는 값을 '저장' 하기보다는 '연산'을 한다는 것이다.
oppositePoint
는 값을 저장하는 역할이 아닌 값을 '연산' 해서 x
에 할당 또는 리턴하는 역할만 한다. 또, 연산 프로퍼티는 값이 고정되어 있지 않기 때문에 반드시 변수 var
로 선언되어야 한다.
자 이렇게 연산 프로퍼티 사용해서 한 프로퍼티에 접근자(getter
)와 설정자(setter
)가 모두 있고, 해당 프로퍼티가 무슨 역할을 하는지 명확하게 표현할 수 있다.
위 코드에서 설정자의 매개변수로 원하는 이름을 명시하면 set
메서드 내부에서 전달받은 전달 인자를 사용 가능하고, newValue
라는 매개변수 이름으로 사용 가능하다. 이럴 경우에는 매개변수를 표기하지 않으면 된다.
newValue
괄호 매개변수 없이 set
만 쓴다면 반드시 newValue
키워드를 사용해야 한다.
또, 접근자 내부의 코드가 만약 한 줄이고 결괏값과 타입이 같다면 return
키워드도 생략 가능하다.
struct CoordinatePoint {
var x: Int = 1
var oppositePoint: CoordinatePoint {
get {
CoordinatePoint(x: -x) //return 키워드 생략
}
//설정자의 매개변수 이름 제거. newValue로 대체가능
set {
x = -newValue.x
}
}
}
var SeogunPosition: CoordinatePoint = CoordinatePoint()
print(SeogunPosition) // x: 1
print(SeogunPosition.oppositePoint) //x: -1
Read-Only Computed Properties
대칭점을 설정할 필요가 없다면 읽기 전용으로 연산 프로퍼티를 사용할 수 있다. 이때는 set
설정자를 제거한 get
접근자만 사용하면 된다. 하지만 set
만 가지는 것은 불가능!
struct CoordinatePoint {
var x: Int
var oppositePoint: CoordinatePoint {
get {
return CoordinatePoint(x: -x)
}
}
}
var SeogunPosition: CoordinatePoint = CoordinatePoint(x: 10)
print(SeogunPosition) // x: 10
print(SeogunPosition.oppositePoint) //x: -10
// ERROR : 설장자 set을 구현하지 않았으므로 접근이 불가능 하다.
SeogunPosition.oppositePoint = CoordinatePoint(x: 20)
읽어주셔서 감사합니다🤟
Swift : 기초문법 [프로퍼티#1 - 저장 프로퍼티]
Swift : 기초문법 [프로퍼티#3 - 프로퍼티 옵저버(감시자) - didSet, willSet]
'SWIFT > Grammar' 카테고리의 다른 글
Swift : 기초문법 [프로퍼티#4 - 타입 프로퍼티] (0) | 2022.01.10 |
---|---|
Swift : 기초문법 [프로퍼티#3 - 프로퍼티 옵저버(감시자) - didSet, willSet] (0) | 2022.01.09 |
Swift : 기초문법 [프로퍼티#1 - 저장 프로퍼티] (0) | 2022.01.08 |
Swift : 기초문법 [UITextField] (0) | 2021.09.29 |
Swift : 기초문법 [ 함수 / 매개변수 / 메서드 ] (0) | 2021.07.09 |