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

Swift类属性初始化问题:为何两段等边三角形类代码一段生效一段失效

两段Swift代码运行差异原因

核心区别:存储属性与计算属性的规则不同

  • 第一段代码中的perimeter是计算属性:它不会预先存储具体数值,只有当它被外部访问时,才会执行大括号内的逻辑实时计算返回值。此时类的实例已经完成初始化,self可正常访问,所以可以正常读取sideLength的值进行计算,且perimeter的值会随sideLength的修改实时更新。
  • 第二段代码中的perimeter是存储属性:Swift语法规定,存储属性的默认值必须在类实例初始化完成前就确定,此时实例还未构造完成,self处于不可用状态,无法访问另一个实例属性sideLength,因此编译器会直接报错,代码无法运行。

补充:如果要让存储属性的写法也能正常运行,可以将perimeter改为懒加载存储属性:

lazy var perimeter: Double = 3.0 * sideLength

懒加载属性只会在第一次被访问时才会赋值,此时实例已经完成初始化,可正常读取sideLength的值。但它和计算属性的区别是:懒加载属性只会计算一次,后续sideLength修改时,perimeter的值不会自动更新。

内容的提问来源于stack exchange,提问作者Tbag

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 20:24:05