공부/SWIFT

[SWIFT] 프로퍼티( 연산 프로퍼티 ) ★★★

알로하리미 2021. 3. 11. 15:57
728x90

1. 개요

프로퍼티는 클래스, 구조체 또는 열거형 등에 관련된 값(속성)을 뜻한다.

저장(Stored), 연산(Computed), 타입 프로퍼티로 나눈다.

연산 프로퍼티 : 특정 타입의 인스턴스에서 특정 연산을 실행한 결과값을 의미 (구조체, 클래스, 열거형에서 사용)

연산 프로퍼티는 전역변수와 지역변수 모두에서 이용 가능

* 전역 상수와 변수는 지연 저장 프로퍼티(Lazy Stored Properties)와 같이 지연 계산(lazy computed) 됩니다.
즉, 호출되는 즉시 연산이 이루어진다는 것.
하지만 지연 저장 프로퍼티(지역변수라 생각하면됨)와 다르게 lazy 키워드를 붙일 필요 없습니다.

반면 지역 상수와 변수는 지연 계산될 수 없습니다. 그러므로 지연시킬시 lazy 키워드를 붙입니다.

* 프로퍼티의 값이 변하는 것을 감시하는 프로퍼티 감시자(Property Observers)도 있다.

 

2. 연산 프로퍼티(Computed Properties)

클래스, 구조체, 열거형은 계산된 프로퍼티를 선언할 수 있습니다

getteroptional한 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 {
    	
        // 저 밑에 let initialSquareCenter = square.center 얘가 실행 될시
        // get 실행 반환값을 갖고 있다.        
        // 한줄이고 결과값의 타입이 프로퍼티의 타입과 같으면 return생략 가능
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        
        // 저 밑에 square.center = Point(x: 15.0, y: 15.0) 얘가 실행 될시
        // set(newCenter)가 실행
        // newCenter는 할당되는 값 Point(x: 15.0, y: 15.0) 보면됨
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
        
        // 추가) newValue 라고 기본 지정된는 이름인데         
        // 이걸 사용하면 위처럼 set(newCenter)라고 안해도됨
        // set {
        //    origin.x = newValue.x - (size.width / 2)
        //    origin.y = newValue.y - (size.height / 2)
        // }
    }
}

var square = Rect(origin: Point(x: 0.0, y: 0.0),
                  size: Size(width: 10.0, height: 10.0))
                  
//.center호출시 따아악! 위의 getter가 실행
let initialSquareCenter = square.center 

//.center에 할당시 따아악! 위의 setter가 실행
square.center = Point(x: 15.0, y: 15.0)

print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// "square.origin is now at (10.0, 10.0)" 출력

 

 

읽기 전용 연산 프로퍼티

getter만 있고 setter는 없는 프로퍼티

반드시 let이 아니라 var로 선언
(getter만 있기때문에 읽기전용이라고 하는 것임 변하지 않는 다는 뜻음 아님)

반드시 반환 값을 제공하고 다른 값을 지정할 수는 없는 프로퍼티.
즉, 계산된 리턴반환값만 존재
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)")
// "the volume of fourByFiveByTwo is 40.0" 출력

 

 

 

 

 

2021.03.11 - [공부/SWIFT] - [SWIFT] 프로퍼티( 저장 프로퍼티 ) ★★★

2021.03.11 - [공부/SWIFT] - [SWIFT] 프로퍼티(타입 프로퍼티) ★★★

2021.03.11 - [공부/SWIFT] - [SWIFT] 프로퍼티( 프로퍼티 옵저버 ) ★★★