有问题的应用程序构建如下:
我不清楚应该如何构造它-应该是类还是结构?看到一次只处理一个作业,我相当有信心该作业应该是一类。但是,当存在某个对象类型的倍数时,我不清楚如何形成它们,例如组件和lineitem对象。
该应用程序由ViewControllers和TableViewControllers组成。所有数据均以JSON格式从服务器中获取,并根据需要填充到适当的视图中。以下是当前设置的对象类型:
作业对象:
// Job Object
//
public struct Job {
static var globalId : String?
static var name : String?
static var status : String?
static var client = Client()
static var components = Array<Component>()
// etc..
}
像这样的组件:
// JobComponent Object
//
public struct Component {
var name:String? = ""
var fmRecordId : String?
var startTS:NSDate?
var endTS:NSDate?
var notes:String? = ""
var items = Array<Lineitem>()
// etc...
}
最后是一个lineitem:
// Lineitem Object
//
public struct Lineitem {
var fmRecordId = String()
var itemName = String()
var itemNumber = String()
// etc...
}
所有这些对象都建立在一个public class
称为“ PL”的内部。
当用户选择lineitem并编辑其值时,这些值在编辑它们的VC之外不可用,因为VC没有引用传递的lineitem,它只是在复制它。组件也是如此。
我发现一种解决方法是使用Job结构,PL.Job.self
并始终像在其中修改组件和lineitems一样,其中i
=数组中的所需索引:
PL.Job.components[i]
访问组件PL.Job.components[i].items[i]
访问该组件中的特定项目。但是,这不能很好地扩展。
期望的行为是能够传递对对象的特定实例的引用,而不是绕过对象中那些对象的索引路径PL.Job
。
我很清楚目前的结构存在问题,但是有人可以指出正确的方向吗?
要点:
您只能通过引用传递类实例。如果您希望能够参考传递给特定的LineItem
或Component
或者Job
,你希望能够更改该对象是有效的无处不在,那么你需要将其定义为类,而不是结构。结构类型的实例始终按值传递,而不是引用。当传递值类型时,它会被复制,这意味着您将创建该对象的全新副本,并且对该副本进行更改不会对原始对象产生影响。
您的Job
结构只有静态属性-即会有永远只能是一个globalId
,name
,status
等您的整个应用程序。如果您想拥有的多个实例Job
,则这些实例不应为静态属性。您说一次Job
只能处理一个,所以也许是故意的。无论哪种方式,创建Job
具有这些属性的类的实例通常还是比较可取的。如果您决定允许在内存中保留对多个作业的引用,或者允许用户在不同的作业之间进行选择,或者在作业之间进行切换等,那么肯定会给您带来更大的灵活性。例如,您可能希望允许用户切换到Job
他们正在处理的较早版本,而不必破坏Job
他们正在努力。
但是我认为要点是,如果您希望能够通过引用传递对象,则需要将它们定义为类。如果修改通过引用传递的对象,则对同一对象的所有其他引用将显示相同的更改(因为毕竟它们只是对同一对象的引用)。这不适用于值类型(例如结构)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句