swift - 如何将数据存储在不同级别但引用同一个对象
问题描述
我刚刚完成了我的第一个应用程序并被拒绝工作。好消息是:我对我的代码的弱点有评论。由于我缺乏经验,我什至很难找到修复它的方法。代码的相关部分是:
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]
这有什么不好的:
- “项目位置是作为项目的属性创建的。但也可以拾取或使用项目。对于这些操作,您不需要项目的位置。因此,此数据过多,仅在特定情况下使用。collectedIndex 也是如此。这些属性应该位于另一个级别"
- “预先在 ViewController 中创建并通过 ViewController 的 vars 访问的固定数量的项目是非常糟糕的决定,与良好编程的所有原则无关”。
在我的代码中,我确实需要为每个项目分配位置和collectedIndex,以使一切正常工作。
任何帮助深表感谢!
解决方案
首先,将您的结构重命名为 Item,最后不带“s”。它不是一个数组。我不确定第一种情况,也许你不需要存储location
和collectedIndex
属性。在第二种情况下,你最好不要为每个对象创建 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)]
}
推荐阅读
- zsh - zsh:标准错误没有被重定向
- c - C Shell:程序挂在第一个孩子中
- c - *s++ 中发生了什么?
- sql - Postgres 数组列不小心变成了文本,如何将其转换回文本数组?
- java - 当第一个实体是具有指定主键的实体之后的以下实体时,如何使用 JPA 获取列表
- nginx - Openshift 中的 NGINX - NGINX 无法解析内部主机名
- android - 可点击的父母和孩子
- python - 'ValueError:无法将输入数组从形状(5,5)广播到形状(5)'用于 scipy.optimize-minimize
- vb.net - Visual Basic 计算器
- compiler-errors - gfortran:错误:-fPIC -ffree-line-length-0:没有这样的文件或目录