首页 > 解决方案 > 如何将数据存储在不同级别但引用同一个对象

问题描述

我刚刚完成了我的第一个应用程序并被拒绝工作。好消息是:我对我的代码的弱点有评论。由于我缺乏经验,我什至很难找到修复它的方法。代码的相关部分是:
Items.swift:

struct Items {
    let imageName: String
    let description: String
    var location = (0, 0)
    var collectedIndex = K.Values.notCollected
}

视图控制器:

var chest = Items(imageName: K.icons.chest, description: K.descriptions.chest)
var key = Items(imageName: K.icons.key, description: K.descriptions.key)
var rock = Items(imageName: K.icons.rock, description: K.descriptions.rock)
var bone = Items(imageName: K.icons.bone, description: K.descriptions.bone)
var mushroom = Items(imageName: K.icons.mushroom, description: K.descriptions.mushroom)
var apple = Items(imageName: K.icons.apple, description: K.descriptions.apple)
    
var items = [Items]()

ViewDidLoad:

items = [chest, key, rock, bone, mushroom, apple]

这有什么不好的:

  1. “项目位置是作为项目的属性创建的。但也可以拾取或使用项目。对于这些操作,您不需要项目的位置。因此,此数据过多,仅在特定情况下使用。collectedIndex 也是如此。这些属性应该位于另一个级别"
  2. “预先在 ViewController 中创建并通过 ViewController 的 vars 访问的固定数量的项目是非常糟糕的决定,与良好编程的所有原则无关”。

在我的代码中,我确实需要为每个项目分配位置和collectedIndex,以使一切正常工作。

任何帮助深表感谢!

标签: swiftxcodeoopmodel-view-controllerstruct

解决方案


首先,将您的结构重命名为 Item,最后不带“s”。它不是一个数组。我不确定第一种情况,也许你不需要存储locationcollectedIndex属性。在第二种情况下,你最好不要为每个对象创建 var,我的意思是

private var items = [Item]()

private func loadData() {
    items = [Item(imageName: K.icons.chest, description: K.descriptions.chest),
             Item(imageName: K.icons.key, description: K.descriptions.key),
             Item(imageName: K.icons.rock, description: K.descriptions.rock)
             Item(imageName: K.icons.bone, description: K.descriptions.bone),
             Item(imageName: K.icons.mushroom, description: K.descriptions.mushroom),
             Item(imageName: K.icons.apple, description: K.descriptions.apple)]
}

推荐阅读