我试图使用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,怎么去呢?
答案 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
}
} }