当前位置: 首页 > 面试题库 >

Swift中willSet和didSet的作用是什么?

那绪
2023-03-14
问题内容

Swift具有类似于C#的属性声明语法:

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

但是,它也具有willSetdidSet动作。这些分别在设置器被调用之前和之后被调用。考虑到setter内可能只有相同的代码,它们的目的是什么?


问题答案:

重点似乎是有时您需要一个具有自动存储
某些行为的属性,例如,通知其他对象该属性刚刚更改。当您只有get/时set,您需要另一个字段来保存值。使用willSetdidSet,可以在修改值时采取措施,而无需其他字段。例如,在该示例中:

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

myProperty每次修改时都会打印其新旧值。仅使用getter和setter,我将需要以下内容:

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代表了几行的经济性,并且字段列表中的噪音更少。



 类似资料:
  • 问题内容: 在属性内处理此时- 和- 之间有什么区别? 从我的角度来看,它们两者都可以为属性设置值。什么时候,为什么,我应该使用- ,什么时候- ? 我知道for 和的结构如下: 问题答案: 什么时候以及为什么要使用willSet / didSet 在值存储 之前 被调用。 新值存储 后 立即调用。 考虑带有输出的示例: 输出: 它像前/后条件一样工作 另一方面,如果要添加例如只读属性,则可以使用

  • Swift开发中, Swift module 和 Swift Package Manager module的区别是什么? 我们如何寻找他们呢?

  • 问题内容: 我是后端Swift的新手,并且以为我会使用Vapor来快速在边项目上启动和运行…我运行了,现在我试图弄清楚类似的意思。有关更多上下文,我在WebServer>源>应用程序>模型> Users.swift中查找: 这是User类的定义: 这个反斜杠点表示什么意思? 问题答案: tl; dr: 我们看一下Swift语言参考,可以肯定的是,这种反斜杠点表示法的用法称为key-path- ex

  • 问题内容: 题 苹果的文档指定: 首次初始化属性时,不会调用willSet和didSet观察器。仅当在初始化上下文之外设置属性的值时才调用它们。 是否可以强制在初始化期间调用它们? 为什么? 假设我有这堂课 我创建了method ,以使处理调用更简洁,但我只想处理函数中的属性。有没有办法在初始化过程中强制此调用? 更新资料 我决定只为我的类删除便捷的初始化器,并强迫您在初始化后设置属性。这使我知道

  • Swift中的切片是什么?它与数组有何不同? 从文档中可以看出,下标(范围)的类型签名是: 为什么不返回另一个而不是? 看起来我可以将一个片与一个数组连接起来: 但这会产生错误: 找不到接受所提供参数的“subscript”的重载 什么是切片?

  • 问题内容: 在Swift 2.2中阅读Darwin库时,我发现了以下代码。 第二行中的“ @_silgen_name”是什么? 我从这里找到了以下信息,但是我想要更多详细信息,例如Apple Developer Library。 如果只是要从C调用的一组特定的Swift函数,则可以使用@_silgen_name属性覆盖改写的名称,和/或使它们成为@convention(c)以使用C调用约定。 问题