在SWIFT中为计算属性设置值

14

我正在尝试学习Swift中的计算属性,并了解到我需要setter来为计算属性设置值。但我现在遇到了困难,请帮帮我,如何使用setter属性设置area中的值?如果您能告诉我何时使用setter属性以及如何使用它,那就太好了。

 class ViewController: UIViewController {
        var width : Int = 20
        var height : Int = 400
        var area: Int{
            get{
                return width * height
            }set(newarea){
                area = newarea*10
          //these line gives me an warning and area is not set
            }
        }

        override func viewDidLoad() {
            super.viewDidLoad()
            println("\(width)")
            println("\(height)")
            println("\(area)") 
         //  gives an error while setting value to computed properties...       area = 5000
         //  for that we need getter and setter properties in area...
            area = 490
            println("the new area for computed properties is as \(area)")
        }

编辑: 然而我发现我可以更改从中派生出来的其他计算属性的属性

set(newValue){
           // self.area = newValue
            width = newValue/10
            println("the new width for computed properties is as \(width)")
        }
    }

但是如果我想要改变计算属性本身怎么办?

3个回答

18

计算属性就是这样:一个计算出的值,你的情况下是从宽度和高度计算得来的。没有实例变量储存属性值,你不能改变“计算属性本身”。

而且这也没有意义:如果面积可以设置为不同的值,那么getter方法应该返回什么?这个新值还是width*height

所以很可能你想要一个只读的计算属性来表示面积:

var area: Int {
    get {
        return width * height
    }
}

正如您已经注意到的那样,setter可以修改其他存储的属性的值,例如:

class Rectangle {
    var width : Int = 20
    var height : Int = 400

    var area: Int {
        get {
            return width * height
        }
        set(newArea){
            // Make it a square with the approximate given area:
            width = Int(sqrt(Double(newArea)))
            height = width
        }
    }
}

但是即使如此,由于整数舍入的原因,结果可能会令人惊讶:

let r = Rectangle()
r.area = 200
println(r.area) // 196

15

我认为你误解了计算属性的概念。按照定义,计算属性是一种其值不能被设置的属性,因为它是被计算出来的,没有独立的存在。计算属性中setter的作用不是设置属性的值,而是设置其他属性的值,从而计算出计算属性的值。例如,取一个正方形,其边长是一个var属性s,而面积是一个计算属性,其getter返回s*s,setter将s设置为newValue(新面积)的平方根。setter并不设置面积,而是设置下一次访问面积属性时所使用的边长值。


这是最好的答案之一。 - novice
1
@新手 除非它不准确。你可以像接受的答案所示,将计算属性设置为已接受的答案。 - JeremyP
@JeremyP 是的,谢谢。 - novice

1
与存储一个值不同,计算属性提供了一个getter,和可选的setter,它们间接地分别检索和设置其他属性和值。
struct Point {
    var x = 0.0 ,y = 0.0
}

struct Shape {
    var origin = Point()
    var centre : Point {
        get {
            return Point (x:origin.x/2 y:origin.y/2)
        }

        set(newCentre) {
            origin.x = newCentre.x/2
            origin.y = newCentre.y/2
        }
    }
}

Shape结构体定义了一个自定义的getter和setter方法,用于计算名为Centre的变量。然后可以通过点语法访问Centre属性,这会调用getter以检索当前属性值。getter实际上会计算并返回代表形状中心的新点,而不是返回现有值。 如果计算属性的setter没有为要设置的新值定义名称,则默认使用“newValue”作为名称。 下面是Rect结构体的另一种替代版本,它利用了这个简写符号。
struct Point {
    var x = 0.0
    var y = 0.0
}

struct Shape {
    var origin = Point()
    var centre : Point {
        get {
            return Point (x:origin.x/2 y:origin.y/2)
        }

        set(newCentre) {
            origin.x = newValue.x/2
            origin.y = newValue.y/2
        }
    }
}

重要提示 - 具有getter但没有setter的计算属性称为只读计算属性。它总是返回一个值,并且可以通过点语法访问。但是,该值无法更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接