프로퍼티

seocho·2022년 9월 6일
0

iOS

목록 보기
12/24

저장된 프로퍼티

var firstValue: Int
let length: Int

상수 구조체 인스턴스 저장된 프로퍼티

let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// this range represents integer values 0, 1, 2, and 3
rangeOfFourItems.firstValue = 6
// this will report an error, even though firstValue is a variable property
> firstValue는 let이기 때문에 변경 불가능

지연 저장된 프로퍼티 (Lazy Stored Properties)

  • 처음 사용될 때까지 초기값은 계산되지 않는 프로퍼티 입니다. 지연 저장된 프로퍼티는 선언 전에 lazy 수정자를 붙여 나타냅니다.
  • let은 인스턴스 초기화가 완료되기 전에 항상 값을 가지고 있어야 하기 때문에 lazy사용 불가능
  • 인스턴스의 초기화가 완료될 때까지 값을 알 수 없는 외부 요인에 인해 초기값이 달라질 때 유용
  • 프로퍼티의 초기값으로 필요할 때까지 수행하면 안되는 복잡하거나 계산 비용이 많이 드는 경우에도 유용합니다.

연산 프로퍼티

특정 상태에 따른 값을 연산하는 프로퍼티 (getter / setter)

적용 전
struct CoordinatePoint {
    var x: Int
    var y: Int
    // 대칭점을 구하는 메서드 - 접근자(getter)
    func oppsitePoint() -> CoordinatePoint {
        return CoordinatePoint(x: -x, y: -y)
    }
    mutating func setOppositePoint(_ opposite: CoordinatePoint) {
        x = -opposite.x
        y = -opposite.y
    }
}
var position: CoordinatePoint = CoordinatePoint(x: 10, y: 20)
//현재 좌표
print(position)
//대칭 좌표
print(position.oppsitePoint())
//대칭 좌표를 (15, 10)으로 설정
position.setOppositePoint(CoordinatePoint(x: 15, y: 10))
print(position) // -15, -10
적용 후
struct CoordinatePoint {
    var x: Int
    var y: Int
    var oppsitionPoint: CoordinatePoint {
        get {
            return CoordinatePoint(x: 10, y: 20)
        }
//        set {
//            x = -newValue.x
//            y = -newValue.y
//        }
        set (someParam) {
            x = -someParam.x
            y = -someParam.y
        }
    }
}

=> 일관성을 유지하여 좀 더 명확하게 표현할 수 있음

프로퍼티 감시자

저장 프로퍼티에서만 사용 가능

willSet
// 매개변수를 지정하지 않았을 때 newValue이 매개변수로 자동 저장
didSet
// 매개변수를 지정하지 않았을 때 oldValue이 매개변수로 자동 저장
class Account {
    var credit: Int = 0 {
        willSet {
            print("잔액이 \(credit)에서 \(newValue)원으로 변경될 예정입니다.")
        }
        didSet {
            print("잔액이 \(oldValue)에서 \(credit)으로 변경되었습니다.")
        }
    }
}
let myAccount: Account = Account()
myAccount.credit = 1000
//잔액이 0에서 1000원으로 변경될 예정입니다.
//잔액이 0에서 1000으로 변경되었습니다.

타입 프로퍼티

각각의 인스턴스가 아닌 타입 자체에 속하게 되는 프로퍼티를 타입 프로퍼티라고 한다.

class Aclass {
    // 저장 프로퍼티
    static var typeProperty: Int = 0
    var instanceProperty: Int = 0 {
        didSet {
            Aclass.typeProperty = instanceProperty + 100
        }
    }
    // 연산 타입 프로퍼티
    static var typeComputedProperty: Int {
        get {
            return typeProperty
        }
        set {
            typeProperty = newValue
        }
    }
}
Aclass.typeProperty = 123
let classInstance: Aclass = Aclass()
classInstance.instanceProperty = 100
print(Aclass.typeProperty)  // 200
print(Aclass.typeComputedProperty)  // 200
profile
iOS 개린이

0개의 댓글