연산 프로퍼티(Computed Property)
→ 값을 ‘저장’한다기보다는 특정한 연산을 통해서 값을 리턴해준다!
How?
- getter
- setter
예)
- getter와 setter를 사용하기위해서는 저장소(tempX)가 필요하다!
class Point {
var tempX : Int = 1
var x: Int {
get {
return tempX
}
set(newValue) {
tempX = newValue * 2
}
}
}
var p: Point = Point()
p.x = 12
- 위 코드에서의 setter에서 newValue는
set(newValue) {
tempX = newValue * 2
}
- 1) 아래와 같이 써도 되고
set(miro) {
tempX = miro * 2
}
- 2) 아예 없애도 된다. → 근데 괄호 없이 사용한다면 무조건 newValue로 사용을 해야된다.
set {
tempX = newValue * 2
}
Apple 예시)
- 아래와 같이 Point와 Size struct를 정의해준다. 그리고 Rectangle 구조체는 Point를 origin으로, center를 origin과 size로 정의해준다.
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)
}
}
}
// Rectangel instance 생성하기
var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))
// get이 발동이된다! -> square.center 값이 무엇인지 연산만 해준거다!
let initialSquareCenter = square.center
print(initialSquareCenter) //(x: 5.0,y: 5.0)
// set이 발동이된다. 새로운 값으로 설정해주는 것이다.
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// Prints "square.origin is now at (10.0, 10.0)"
Apple 예시) - Shorthand Setter Declaration 적용
- set에서 (괄호)를 없애고 축약형으로 바꿔주자!
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)
}
// 괄호를 없애고 newValue로 해준다!
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
Read-Only Computed Properties
- get만 존재하는 연산 프로퍼티!
- get을 생략할 수 도 있다.👍
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
Computed Properties 정리
- 무조건 저장소가 필요하다 -> 무조건은 아니다! 아래의 예에서는 저장소가 필요가 없다.
- 연산프로퍼티는 var로 선언이되어야한다.
- get만 구현하는 것은 가능
- set만 구현하는 것은 불가능
- set의 파라미터는 생략이 가능하지만, 그럴 경우 newValue라는 키워드를 사용한다.
아래와 같은 예에서는 연산프로퍼티이지만 저장소가 필요 없다.
struct Person { var person: String { get { UserDefaults.standard.string(forKey: "KIM")! } set(newValue) { UserDefaults.standard.set(newValue, forKey: "KIM") } } } var person1 = Person() person1.person = "what" person1.person // "what"
'Swift' 카테고리의 다른 글
[Swift] , 와 &&의 차이점 (0) | 2023.02.04 |
---|---|
[Swift] - Access Control (0) | 2023.02.04 |
[Swift] 타입 프로퍼티, 타입 메소드 (0) | 2023.02.04 |
[Swift] first 문 (0) | 2023.02.04 |
[Swift] 배열 안전하게 조회하기 (0) | 2023.02.04 |