[Swift] - Computed Property(연산 프로퍼티)

longlivedrgn·2023년 1월 1일
0

swift문법

목록 보기
29/36
post-thumbnail

연산 프로퍼티(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만 존재하는 연산 프로퍼티!
struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
        return width * height * depth
    }
}

Computed Properties 정리

  1. 무조건 저장소가 필요하다
  2. 연산프로퍼티는 var로 선언이되어야한다.
  3. get만 구현하는 것은 가능
  4. set만 구현하는 것은 불가능
  5. set의 파라미터는 생략이 가능하지만, 그럴 경우 newValue라는 키워드를 사용한다.

0개의 댓글