Swift具有类似于C#的属性声明语法:
var foo: Int {
get { return getFoo() }
set { setFoo(newValue) }
}
但是,它也具有willSet
和didSet
动作。这些分别在设置器被调用之前和之后被调用。考虑到setter内可能只有相同的代码,它们的目的是什么?
重点似乎是有时您需要一个具有自动存储 和
某些行为的属性,例如,通知其他对象该属性刚刚更改。当您只有get
/时set
,您需要另一个字段来保存值。使用willSet
和didSet
,可以在修改值时采取措施,而无需其他字段。例如,在该示例中:
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
}
}
}
因此willSet
,didSet
代表了几行的经济性,并且字段列表中的噪音更少。
问题内容: 在属性内处理此时- 和- 之间有什么区别? 从我的角度来看,它们两者都可以为属性设置值。什么时候,为什么,我应该使用- ,什么时候- ? 我知道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调用约定。 问题