Swift的属性声明语法与C#非常相似:

var foo: Int {
    get { return getFoo() }
    set { setFoo(newValue) }
}

然而,它也有willSetdidSet个动作.分别在调用setter之前和之后调用.考虑到setter中可能只有相同的代码,它们的目的是什么?

推荐答案

重点似乎是,有时,您需要一个具有某些行为的属性,例如通知其他对象该属性刚刚更改.如果只有get/set,则需要另一个字段来保存该值.使用willSetdidSet,可以在修改值时执行操作,而不需要另一个字段.例如,在那个例子中:

class Foo {
    var myProperty: Int = 0 {
        didSet {
            print("The value of myProperty changed from \(oldValue) to \(myProperty)")
        }
    }
}

myProperty每次修改时都会打印其新旧值.有了接球手和二传手,我需要这个:

class Foo {
    var myPropertyValue: Int = 0
    var myProperty: Int {
        get { return myPropertyValue }
        set {
            print("The value of myProperty changed from \(myPropertyValue) to \(newValue)")
            myPropertyValue = newValue
        }
    }
}

因此,willSetdidSet代表了几行的经济性,并且字段列表中的噪音更少.

Swift相关问答推荐

更改正在进行的异步任务的完成(SWIFT并发)(&q;)?

SwiftUI - NavigationLink(value:)和navigationDestination不工作

从Firebase播放音频文件不起作用

同时具有每个文本的标识符的文本组的可扩展性标识符

Swift图表';chartXVisibleDomain挂起或崩溃

SwiftUI,如何更改具有多个按钮和一个布尔条件的一个按钮标签

SwiftUI 交易:根据外部状态制作一个动画或静止的按钮

Firebase removeObserver 在 Swift 5 中不起作用

TextField 键入未完成

响应 UITextField (UIViewRepresentable) 中的特定按键

从 Swift 列表中的行中检索值

令人满意的 var body:协议扩展中的一些视图

为什么 switch 在 optional 中不接受 case nil?

Xcode swift ui 错误KeyPathComparator仅在 macOS 12.0 或更高版本中可用

使用 swift 运行 pod install 时出错

iOS 判断应用程序是否可以访问麦克风

根据禁用与否更改 SwiftUI 中按钮的 colored颜色

SwiftUI:将多个 BindableObjects 放入环境

UITableView 布局在 push segue 和 return 上搞砸了. (iOS 8、Xcode beta 5、Swift)

为什么 double 类型的主窗口是可选的?