클래스, 구조체, 열거형에서 사용된다.
저장 프로퍼티와 달리 저장 공간을 갖지 않고, 다른 "저장 프로퍼티"의 값을 읽어 연산을 실행하거나, 프로퍼티로 전달받은 값을 다른 프로퍼티에 저장한다!
때문에 항상 var로 선언되어야 한다!
이게 뭐누... 맨날 정의만 보면 무슨 말이닞 모르겠음 여기서 중점은!
직접 값을 가지지는 않고, 다른 저장 프로퍼티랑 이러쿵 저러쿵 한단다 쿵따따
1) getter: 어떤 저장 프로퍼티의 값을 연산해서 return할 것인지, return구문이 항상 존재해야 함!
2) setter: 파라미터로 받은 값을 어떤 저장 프로퍼티에 어떻게 설정할 것인지를 구현!
var name: Type {
get {
statements
return expr
}
set(name) {
statements
}
}
이를 기준으로 연산 프로퍼티를 다시 정의하면
실제 값을 저장하고 있는 것이 아니라 getter와 optional한 setter를 제공해 값을 탐색하고 간접적으로 다른 프로퍼티 값을 설정할 수 있는 방법을 제공하는 프로퍼티!
class Person {
var nickName: String {
get {
return nickName
}
set (nickName) {
self.nickName = nickName
}
}
이렇게 하면 완성~ 이 아니라 저렇게 하면 졸라 많은 오류메세지 발생
why?
연산 프로퍼티는 다른 저장 프로퍼티랑 쿵짜짜 쉘위댄스 해야됨
근데 위 코드에서는 get, set에서 nickname이란 연산 프로퍼티랑 놀고 있음....ㅠㅠ
무조건 읽거나 쓸 수 있는 저장 프로퍼티가 먼저 존재하야 하고!
연선 프로퍼티에선 다른 저장 프로퍼티의 값을 읽거나 쓰는 작업을 해야한다!
+) 원한다면 다른 연산 작업들을 직접 추가해줄 수도 있다!
class Person {
var name: String = "hidi"
var nickName: String {
get {
return name
//or
return self.name + "기여미😚😚" //+)point
}
set (name) {
self.name = name
//or
self.name = name + "❤️" //+)point
}
}
우리가 아무렇지 않게 사용하던 저장 프로퍼티처럼 사용하면 된다!
let hidi: Person = .init()
// get에 접근
print(hidi.nickName) // hidi기여미😚😚
// set에 접근
hidi.nickName = "유서린 남친"
print(hidi.nickName) // 유서린 남친❤️
Q. 우리가 정의에서 optional setter라 한 이유는 무엇일까?
A. 이미 연산 프로퍼티를 선언할 때 Type을 반드시 명시해줬기 때문이다.
set의 파라미터는 단 하나만 존재하고, 파라미터의 이름은 name 말고 다른것도 가능
set(cute) { self.name = cute + "❤️"
만약! set의 파라미터의 이름을 짓기 힘든새럼? => get처럼 파라미터 받는 부분을 날리고
New Value라는 이름을 접근
set {
self.name = newValue + "❤️"
}
연산 프로퍼티에서 setter가 필요 없다면, getter만 선언해줄 수 있음!
get만쓰면 get 구문 자체를 없앨 수 있음!
class Person {
var name: String = "hidi"
var nickName: String {
return self.name + "기여미😚😚" //+)point
}
}
연산 프로퍼티는 반드시 get + set or get-only만 가능하다!