Programing

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

lottogame 2020. 8. 16. 21:44
반응형

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


Swift에서 저장된 속성의 setter를 어떻게 덮어 쓰나요?

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

Card라는 속성 이있는 클래스가 있다고 가정 해 보겠습니다 rank. 클라이언트가 잘못된 값을 제공하지 않기를 원하므로 Objective-C에서 덮어 써서 setRank추가 검사를 수행 할 수 있습니다 . 그러나 willSetSwift에서는 newValue상수 이기 때문에 도움이되지 않는 것 같고 ranksetter가 루프에서 호출되기 때문에 할당하는 것은 의미가 없습니다 .


확인. 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")
        }
    }
}

기본 매개 변수 이름은 newValuefor willSetoldValuefor didSet이거나 에서 같이 직접 이름을 지정할 수 있습니다 willSet(newTotalSteps).


속성 값이 일시적으로 잘못되었다는 문제가있는 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
    }
}

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

  • willSet 및 didSet은 인스턴스 변수에 대해 호출됩니다 (변경 사항을 무시하려면 didSet 사용)
  • set and get are purely for computed properties

Simplified Example:

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

Full example

Check out perimeter in this example.

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. 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

반응형