swift属性setter没有被调用

时间:2018-04-02 13:01:29

标签: swift

我试图使用getter和setter借助公式area =(length * base)/ 2使用getter和setter来计算三角形的面积

    class Triangle {
   var length: Double
   var base:Double 
   var name:String 
     init(length: Double, base:Double, name:String ) {

    self.length = length
    self.name =  name
    self.base = base  
    }

    var area: Double {
    get { // getter
        return base * length
    }
         set { //setter
             area = newValue / 2.0
    }
   }
  }


 var triangle = Triangle(length:5,base:4,name:"f")
 print(triangle.area) 

返回的区域应为10,但它返回20,即不会调用setter步骤。编译器忽略了setter步骤,即使我注释掉了setter步骤,它对编译器没有任何影响。我想用setter,怎么去呢?

2 个答案:

答案 0 :(得分:1)

在我看来,区域是计算属性。它不应该是只读的计算属性吗?在我看来,有多个三角形具有给定区域但高度/基值不同,因此不能以有意义的方式设置区域。

var area: Double {
  get { // getter
    return 0.5 * base * length
  }
}

您还缺少区域公式/2的{​​{1}}部分。这就是为什么你的结果是20,应该是10。

答案 1 :(得分:0)

area是一个计算变量。它不存储任何值。所以你必须在某处保存你的newValue。如,

class Triangle {
    var length: Double
    var base:Double
    var name:String
    init(length: Double, base:Double, name:String ) {
        self.length = length
        self.name =  name
        self.base = base
    }

    var area: Double {
        get { // getter
            return base * length
        }
        set { //setter
            let tmpArea = newValue / 2.0
            let squared = sqrt(tmpArea)
            base = squared
            length = squared
        }
    } }