 Apple Lover Developer & Artist

영속적인 디자인에 현대의 공감을 채워넣는 공방입니다

 Apple/Swift Programming Language

[Swift] 공식문서 씹어먹기: Property - Computed Property

singularis7 2021. 10. 22. 17:13
반응형

개요

  • classes, structures, enumeration 에서는 computed properties 를 선언할 수 있다.
  • computed property 의 값은 고정되어있지 않기 때문에 var 키워드를 통해 선언되어야 한다.
  • 실질적인 값을 저장하지 않는 대신 다른 property에 간접적으로 값을 얻고 설정하기 위해 getter 와 optional setter를 제공한다.
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)
        }
    }
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
                  size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
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)"
  • Point : x-y 좌표계에서의 좌표를 캡슐화 한다.
  • Size : width 와 height 를 캡슐화 한다.
  • Rect : 사각형의 원점과 크기를 정의한다.

square 변수의 center property 에 접근하면 getter 가 호출되어 현재 property의 값을 얻을 수 있다.

getter 는 사각형의 중심에 해당하는 좌표값을 계산하여 반환한다.

반대로 center의 setter 를 사용하여 사각형의 중심을 바꾸면 x, y 좌표값을 알맞게 변환하여 origin property 에 저장한다.

위와 같은 원리로 사각형의 위치가 이동하게 된다.

Setter의 선언을 조금 더 간결하게 표현하는 방법

  • 기존 computed variable의 setter에서 새로운 값을 받아올 때 newValue 파라미터를 통해 받아왔다.
  • 기존처럼 인자의 이름을 지정해주지 않아도 새로 설정된 값을 불러올 수 있다.
  • 이때 기본 입력값의 이름은 newValue 이다.
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 {
        origin.x = newValue.x - (size.width / 2)
        origin.y = newValue.y - (size.height / 2)
    }
}

Getter의 선언을 조금 더 간결하게 표현하는 방법

  • getter가 body 에서 한줄의 expression으로 선언되었다면 암묵적으로 return 키워드를 생략할 수 있습니다.
var center: Point {
    get { 
        Point(x: origin.x + (size.width / 2), 
              y: origin.y + (size.height / 2))
    }
    set {
        origin.x = newValue.x - (size.width / 2)
        origin.y = newValue.y - (size.height / 2)
    }
}

Read-Only Computed Properties

  • getter는 있는데 setter가 없는 computed property를 읽기 전용 computed property 라고 부른다.
  • 읽기 전용 computed property 는 언제나 값을 반환하며 dot syntex 를 통해 접근할 수 있다.
  • 읽기 전용 computed property 를 선언할 때 get 키워드를 생략할 수 있다.
      struct Cuboid {
          var width = 0.0, height = 0.0, depth = 0.0
          var volume: Double {
              return width * height * depth
          }
      }
      let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
      print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
      // Prints "the volume of fourByFiveByTwo is 40.0"
반응형