如何在 swift 中更改子类中的属性值?

阿斯托斯特

根据 swift 语言指南的继承章节,我尝试在子类中编写计算的 peoperty。当我将 newValue 设置为类实例的属性时,setter 似乎可以工作,而属性值没有转换为 newValue。

class Vehicle {
    var currentSpeed = 1.0
    var description: String {
        return "The current speed is \(currentSpeed) miles per hour"
    }
    func makeNoise() {
    }
}
class Car: Vehicle {
    var gear = 0
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}
class AutomaticCar: Car {
    override var currentSpeed: Double {
        get {
            return super.currentSpeed
        }
        set {
            gear = Int(newValue/10) + 1
        }
    }
}

let automaticCar = AutomaticCar()
automaticCar.currentSpeed = 12.0
print(automaticCar.currentSpeed)//It prints "1.0"
print(automaticCar.description)//It prints "The current speed is 1.0 miles per hour in gear 2"

AutomaticCar.currentSpeed 的属性值仍然是“1.0”而不是“12.0”,而实例的 gear 属性似乎有效。我已经搜索了但没有找到答案,是什么原理导致了这种情况?

进一步的问题:

class A {
    var test1 = 1
    var test2 = 2
    var sum: Int {
        get {
            return test1 + test2
        }
        set {
            test1 = newValue - test2
        }
    }
}
var a = A()
print(a.sum)
a.sum = 4
print(a.sum)//It ptints "4"
print(a.test1)//It prints "2"

在这种情况下,我不需要刻意设置 new sum 属性的值,这两种情况有什么区别?

哑光

在你的真实例子中:

  • 车辆currentSpeed储存的财产。这意味着您可以直接分配给它并且属性值会发生变化。

  • AutomaticCarcurrentSpeed实际上是一个不同的属性——一个计算属性。这意味着当您分配给它时,所发生的一切就是该set函数运行。结果不会更改存储的属性值,除非set函数中更改它们

好吧,在您的 AutomaticCarcurrentSpeed set函数中,您没有将新值存储在存储属性 Vehicle's 中currentSpeed因此它没有改变,因为没有发生任何改变它的事情。

正如 Hamish 在评论中正确地说的那样,您的意思可能是这样的:

class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            self.gear = Int(self.currentSpeed/10) + 1
        }
    }
}

在该公式中,AutomaticCarcurrentSpeed不是计算属性;Vehicle currentSpeed- 它是完全相同的存储属性,以及一个 setter 观察者。所以设置它会设置它,存储新值——加上现在我们运行 setter 观察器并进行self.gear你所追求的改变

请注意,子类中存储属性的覆盖必须是其中之一,要么是独立的计算属性,要么是添加了 setter 观察者的原始存储属性。它本身不能是一个独立的存储属性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Swift中更改结构属性

来自分类Dev

如何在SWIFT 5中更改对象结构的值

来自分类Dev

如何在Swift中更改navigationBar字体?

来自分类Dev

如何在Swift中更改UIButton的形状?

来自分类Dev

如何在Swift中更改UIBezierPath的颜色?

来自分类Dev

如何在Swift中更改PFUser密码?

来自分类Dev

如何在Swift中更改字体样式

来自分类Dev

如何在Swift中更改UIBarButtonItem的文本

来自分类Dev

如何在Swift中更改协议变量

来自分类Dev

如何在Swift中更改PFUser密码?

来自分类Dev

如何在Swift中更改文字颜色?

来自分类Dev

如何在Swift中覆盖属性?

来自分类Dev

如何在Swift中遍历struct属性?

来自分类Dev

如何在子类python中更改父级属性

来自分类Dev

如何在Swift中对数组类进行子类化?

来自分类Dev

如何在Swift子类中实现复制构造函数?

来自分类Dev

如何在Swift中为结构子类化?

来自分类Dev

如何在Swift 5中正确使用子类

来自分类Dev

Swift:如何在子类的init方法中对指令进行排序

来自分类Dev

如何在 Swift 中从其 ViewController 获取 UIView 子类实例

来自分类Dev

如何在Swift中附加Dictionary值

来自分类Dev

如何在Swift中打印可选值?

来自分类Dev

如何在 Swift 中重置滑块值?

来自分类Dev

Swift如何在属性属性中实现ARC?

来自分类Dev

如何在Swift中更改CATextLayer中的文本颜色

来自分类Dev

如何在Swift中从AppDelegate更改ViewController中的文本标签?

来自分类Dev

如何在swift 4中获取CATextLayer的“字符串”属性值?

来自分类Dev

如何在Swift 2.0中从Dict中删除重复值

来自分类Dev

如何在Swift中从数组中删除给定值的元素

Related 相关文章

热门标签

归档