您不应该在快速结构中存储什么?
答:参考类型。
您在任何地方搜索都会发现值类型和引用类型之间的差异。 但是,当您将两者混在一起时,文档尚不清楚。 该结构将失去其(表观)不变性。
让我们用一个例子来解释一下:假设我们正在使用一种结构来存储与广告相关的配置
struct AdConfig {
var prefetchCount:Int
var wrapperView:UIView?
}
公司要求我们在每个屏幕上展示广告,因此我们决定使用静态默认值:
struct AdConfig {
var prefetchCount:Int
var wrapperView:UIView?
static let`default`:AdConfig = AdConfig(prefetchCount:10,
wrapperView:UIView(frame:CGRect.zero))
}
太棒了! 现在我们可以使用AdConfig.default 无需显式创建实例的任何位置。
现在,在一个屏幕中,我们有不同的设计,因此,我们将复制默认实例并修改值:
var customConfig = AdConfig.default
customConfig.wrapperView?.backgroundColor = UIColor.red
AM! 现在,无论您走到哪里,所有广告现在都具有红色背景,即使我们的默认变量是let常量并且应该是不变的。
您可以在操场上跑步:
因此,请勿在您的结构中存储以下任何内容:
- 迅捷类实例
- 任何NSObject子类
- 闭包(是的,它们是参考类型)
如果必须的话,请确保您了解它的含义(以及调试数小时和数小时来修复一些奇怪的错误)。