programing

신속한 프로그래밍: 저장된 속성의 getter/setter

javamemo 2023. 8. 23. 21:32
반응형

신속한 프로그래밍: 저장된 속성의 getter/setter

Swift에서 저장된 속성의 설정자를 덮어쓰려면 어떻게 해야 합니까?

Obj-C에서는 세터를 덮어쓸 수 있지만 Swift는 저장된 속성에 게터/세터가 사용되는 것에 만족하지 않는 것 같습니다.

나한테 있다고 해주세요.Card속성이 다음과 같은 클래스rank클라이언트가 잘못된 값을 제공하지 않기를 원하므로 목표-C에서 덮어쓸 수 있습니다.setRank추가 검사를 수행하도록 합니다.willSet스위프트에서는 도움이 되지 않는 것 같습니다.newValue일정하며 할당하는 것은 의미가 없습니다.rank왜냐하면 세터는 루프에서 호출되기 때문입니다.

좋습니다. Swift에 대한 Apple 문서를 읽어보니 다음과 같습니다.

자체 didSet 관찰자 내에서 속성에 값을 할당하면 할당한 새 값이 방금 설정된 값을 대체합니다.

그래서 당신이 해야 할 일은 다음과 같습니다.

var rank: Int = 0 {
    didSet {
        // Say 1000 is not good for you and 999 is the maximum you want to be stored there
        if rank >= 1000  {
            rank = 999
        }
    }
}

무시할 수 없습니다.get/set저장된 속성의 경우 속성 관찰자를 사용할 수 있습니다.willSet/didSet:

var totalSteps: Int = 0 {
    willSet(newTotalSteps) {
        println("About to set totalSteps to \(newTotalSteps)")
    }
    didSet {
        if totalSteps > oldValue  {
            println("Added \(totalSteps - oldValue) steps")
        }
    }
}

기본 매개 변수 이름은 다음과 같습니다.newValue위해서willSet그리고.oldValue위해서didSet아니면 당신이 직접 이름을 지을 수 있습니다.willSet(newTotalSteps).

get 및 set는 계산된 속성에 대한 것입니다(백업 저장소가 없음).(내 생각에는, 여기서 키워드 'var'는 혼란스럽습니다)

  • 인스턴스 변수에 대해 willSet 및 didSet이 호출됩니다(변경 내용을 재정의하려면 UsedidSet을 사용합니다).
  • set 및 get은 순전히 계산된 속성을 위한 것입니다.

속성 값이 일시적으로 잘못되었다는 문제가 있는 didSet을 사용하지 않으려면 계산된 속성을 해당 속성 주위에 묶어야 합니다.

private var _foo:Int = 0
var foo:Int {
    get {
        return _foo
    }
    set {
        if(newValue > 999) {
            _foo = 999
        } else {
            _foo = newValue
        }
    }
}

또는:

private var _foo:Int = 0
var foo:Int {
    get {
        return _foo
    }
    set {
        guard newValue <= 999 else {
            _foo = 999
            return
        }
        _foo = newValue
    }
}

단순화된 예:

class Shape {
    var sideLength: Double {
    get {
        return self.sideLength
    }
    set {
        // Implement the setter here.
        self.sideLength = newValue
    }
    }
}

전체 예

체크아웃perimeter이 예에서는

발췌: Apple Inc."스위프트 프로그래밍 언어" 아이북스.https://itun.es/us/jEUH0.l

class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }

    var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
    }

    override func simpleDescription() -> String {
        return "An equilateral triagle with sides of length \(sideLength)."
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength”

언급URL : https://stackoverflow.com/questions/24114732/swift-programming-getter-setter-in-stored-property

반응형