2015-04-25 154 views
0

所讨论的应用程序建立如下:模型类似于关系数据库的类还是结构?

  • 用户选择的作业
  • 的作业可以具有许多组件
  • 每个组件可以有很多了LineItem。

我不清楚这应该如何构造 - 这应该是类或结构?看到一次只处理一项工作,我相信工作应该是一个阶级。但是,当某个对象类型有多个时,我不太清楚如何形成它们,例如组件和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 Object 
// 
public struct Lineitem { 

    var fmRecordId = String() 
    var itemName = String() 
    var itemNumber = String() 
    // etc... 
} 

所有这些对象都在名为“PL”的public class内构建。

当用户选择lineitem并编辑它的值时,这些值在编辑它们的VC之外是不可用的,因为VC没有引用传递的lineitem,而只是复制它。组件也是如此。

我发现一种解决方法是使用作业结构PL.Job.self始终修改的组件和了LineItem像这样其中i =阵列中的期望的索引:

  • PL.Job.components[i]访问部件
  • PL.Job.components[i].items[i]访问该组件中的特定项目。

但是,这并没有很好地扩展。

期望的行为是能够将引用传递给对象周围的特定实例,而不是绕过PL.Job对象中这些对象的索引路径。

我很清楚目前这种结构有什么问题,但是有人能指点我吗?

回答

0

几个要点:

  • 您只能通过引用传递类实例。如果您希望能够传递对特定LineItemComponentJob的引用,并且您希望能够对该对象进行更改并且在任何地方都有效,那么您需要将它们定义为类而不是结构。结构类型的实例是总是按值传递而不是引用。当一个值类型被传递时,它被复制,这意味着你创建了一个全新的对象副本,并且改变副本对原始文件没有影响。

  • Job结构只有静态属性 - 即,将有永远只能是一个globalIdnamestatus等您整个应用程序。如果你想有多个Job的实例,那么这些不应该是静态属性。你说一次只能处理一个Job,所以也许这是故意的。无论哪种方式,创建具有这些属性的Job类的实例仍然通常更可取。如果您决定在内存中保留对多个作业的引用,或者允许用户在不同的作业之间进行选择,或在作业之间进行切换等,它肯定会给您更大的灵活性。例如,您可能想要允许一个用户切换到他们之前正在处理的Job,而不必破坏他们正在处理的Job

但我认为最重要的是你需要定义你的对象作为类,如果你想能够通过引用传递它们。如果修改通过引用传递的对象,则对同一对象的所有其他引用将显示相同的更改(因为毕竟它们只是对同一对象的引用)。这不适用于值类型,如结构。

+0

非常有助于澄清这一点,谢谢。有没有办法回到“爬上”阶梯?例如,给定一个项目,是否有可能获得与其相关的工作信息? –

+1

是的,但您需要创建一个包含作业参考的属性。因此,给'LineItem'一个名为'job'的属性,并在初始化它时传递给'Job'的引用:'init(job:Job){self.job = job}' – letvargo

相关问题