swift - 覆盖 Swift 3 中的属性

标签 swift inheritance getter-setter

我想覆盖以下类中的属性。假设我有一个类 A,它有一个 bool 属性 r。对于父类(super class)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)

最佳答案

我同意@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"

关于swift - 覆盖 Swift 3 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44788987/

相关文章:

ios - 如果 json 有效负载中有一个标签类型不匹配,为什么 swift4 中的 Decode 方法会给出对象 nil

ios - 如何在搜索后只加载 TableView ?

swift - Sprite Kit SKAction 是否具有持续时间慢的功能执行?

javascript - 是否可以从继承的工厂方法一般实例化 JS 类类型?

ruby - setter/getter 真的不修改实例变量吗?

ios - 使用 Realm 和结果 JSON

c++ - 替换 Qt 中的小部件

java - 里氏替换原则和多重层次结构

Ruby 以一种方法获取和设置

python - 对 python 类使用 'get function' 有什么好处?