신속한 프로그래밍: 저장된 속성의 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
'programing' 카테고리의 다른 글
| Ajax 응답 내부에 반환된 js 파일 실행 (0) | 2023.08.23 | 
|---|---|
| open()에서 FileNotFoundError / IOError: '[Errno 2] 해당 파일 또는 디렉터리가 없습니다.' (0) | 2023.08.23 | 
| Mercurial 폴더를 Git 저장소로 변환 (0) | 2023.08.23 | 
| MySql: 열을 표시하지만 필드 이름을 제외한 모든 항목 제외 (0) | 2023.08.23 | 
| 콘솔에서 대화형으로 값 읽기 (0) | 2023.08.18 |