在Swift 3中覆盖属性

7ba*_*all 1 inheritance getter-setter swift

我想覆盖以下类中的属性.假设我有一个A具有布尔属性的类r.对于超类A,我希望r被设置并获得正常.对于子类B,我想r永远是false.我不确定为什么这比它应该更难......

class A {
    init(r: Bool) {
        self.r = r
    }

    var r: Bool {
        willSet(n) {
            r = n
        }
        get {
            return r
        }
    }
}

class B: A {
    override var r: Bool {
        willSet(n) {
            r = n
        }
        get {
            return false
        }
    }
}

let a = A(r: true)
a.r = false
print(a.r)  // prints 'false', which is good

let b = B(r: true)
print(b.r)  // prints 'true'
b.r = false // ERROR: I can't get pass this point 'Execution was interrupted on playground
print(b.r)
Run Code Online (Sandbox Code Playgroud)

zpa*_*ack 5

我同意@Hamish:基类中的存储属性,带有计算属性覆盖.除外,只读属性不能覆盖可变属性.但是,你可以让被覆盖的setter什么也不做,被覆盖的getter返回你想要的东西.

class A {
    init(r: Bool) {
        self.r = r
    }

    var r: Bool
}

class B: A {
    override var r: Bool {
        set {}
        get {
            return false
        }
    }
}

let a = A(r: true)
print(a.r) // "true"
a.r = false
print(a.r) // "false"

let b = B(r: true)
print(b.r) // "false"
b.r = true
print(b.r) // "false"
Run Code Online (Sandbox Code Playgroud)