学习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
相关产品推荐
相关产品推荐

