You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:35:54