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

学习willSet与didSet语法时遇Playground执行错误求助

搞定Swift Playground里的argument passed to call that takes no arguments报错

嘿,我帮你捋清楚这个问题哈~你遇到的错误根源很明确:你写的AAA类没有能接收两个参数的初始化方法,Swift默认给类生成的是无参初始化器(因为你的属性都设了默认值),但你却想用AAA("EEE", 5)传两个参数创建实例,编译器当然会懵圈啦!

修正方案

我们给AAA类加个自定义初始化器就行,同时完全保留你原来写的willSet和didSet逻辑,修改后的代码如下:

class AAA {
    var name : String = "eee"
    var number : Int = 4 {
        willSet{
            print("\(number) -> \(newValue)") // 值变更前:提示即将替换的数值
        }
        didSet{
            print("Changed: \(number - oldValue)" ) // 值变更后:输出数值的变化量
        }
    }
    
    // 新增接受name和number的初始化器
    init(name: String, number: Int) {
        self.name = name
        self.number = number
    }
    
    // 如果还想保留无参创建实例的能力,就加上这个
    init() {}
}

// 现在就能正常创建实例啦
var JAM = AAA(name: "EEE", number: 5)

小补充

  • 要是你不想用name:和number:这些外部参数标签,也可以把初始化器写成这样:init(_ name: String, _ number: Int),这样创建实例时就能直接写AAA("EEE", 5),和你最开始的写法完全一致。
  • 你写的willSet和didSet逻辑完全没问题!等你后续修改JAM.number的时候,这两个属性观察器会正常触发:
    JAM.number = 10
    // 会输出:4 -> 10
    // Changed: 6
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:36:58