您不应该在快速结构中存储什么?

答:参考类型。

您在任何地方搜索都会发现值类型和引用类型之间的差异。 但是,当您将两者混在一起时,文档尚不清楚。 该结构将失去其(表观)不变性。

让我们用一个例子来解释一下:假设我们正在使用一种结构来存储与广告相关的配置

  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子类
  • 闭包(是的,它们是参考类型)

如果必须的话,请确保您了解它的含义(以及调试数小时和数小时来修复一些奇怪的错误)。