Swift属性Setter未被调用问题求助:三角形面积计算代码排查
问题分析与解决
首先,你的代码里Setter没被调用的核心原因很简单:你从来没有给area属性赋值过!print(triangle.area)只是读取这个属性的值,只会触发Getter,Setter只有在你执行类似triangle.area = 某个值的时候才会被调用。
除此之外,你的代码还有两个关键问题:
- Getter的计算逻辑错误:三角形面积公式是
(底 × 高) / 2,但你当前直接返回base * length,少了除以2的步骤,所以结果不符合预期。 - Setter的逻辑会导致无限递归:在Setter里写
area = newValue / 2.0,相当于再次调用area的Setter,会陷入死循环,程序会崩溃。
正确的实现方式(推荐)
因为三角形的面积是由底和高推导出来的,通常不需要手动设置面积,所以area作为只带Getter的计算属性就足够了:
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 } // 只保留Getter的计算属性,正确实现面积公式 var area: Double { return (base * length) / 2.0 } } let triangle = Triangle(length: 5, base: 4, name: "f") print(triangle.area) // 输出10.0,符合预期
如果确实需要支持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 { return (base * length) / 2.0 } set { // 固定length(高),通过新的面积反推base(底) base = (newValue * 2.0) / length } } } var triangle = Triangle(length: 5, base: 4, name: "f") print(triangle.area) // 初始面积10.0 // 给area赋值,触发Setter triangle.area = 15.0 print(triangle.base) // 底被反推为6.0 print(triangle.area) // 新的面积15.0,符合预期
这样Setter就能被正常调用,同时避免了递归问题,逻辑也符合数学推导。
内容的提问来源于stack exchange,提问作者askit
相关产品推荐
相关产品推荐

