类似于关系数据库的模型的类或结构?

时间:2015-04-25 17:10:33

标签: ios class swift struct reference

有问题的申请建立如下:

  • 用户选择作业
  • 该职位可以有很多组成部分
  • 每个组件可以有许多lineitems。

我不清楚这应该如何构建 - 这应该是类还是结构?看到一次只处理一份工作,我相信工作应该是一个班级。但是,当某个对象类型有多个时,我不清楚如何形成它们,比如组件和lineitem对象。

该应用程序由ViewControllers和TableViewControllers组成。所有数据都是从JSON中的服务器获取的,并根据需要填充到适当的视图中。以下是当前设置的对象类型:

工作对象:

require_once('TwitterAPIExchange.php');

/** Set access tokens here - see: https://dev.twitter.com/apps/ **/
$settings = array(
    'oauth_access_token' => "***",
    'oauth_access_token_secret' => "***",
    'consumer_key' => "***",
    'consumer_secret' => "***"
);

    $url = 'https://api.twitter.com/1.1/account/update_profile_image.json';
    $requestMethod = 'POST';

    $postfields = array(
        'image' => 'data:image/jpg;base64,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',
        'include_entities' => 'false',
        'skip_status' => 'false'
    );

    $twitter = new TwitterAPIExchange($settings);
    echo $twitter->buildOauth($url, $requestMethod)
                 ->setPostfields($postfields)
                 ->performRequest();

像这样的组件:

// 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..
}

最后,一个lineitem:

// 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... } 被称为&#34; PL&#34;内构建的。

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

我找到的解决方法是使用Job结构public class并始终修改组件和lineitems,如PL.Job.self =数组中所需的索引:

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

然而,这并不能很好地扩展。

所需的行为是能够将引用传递给对象的特定实例,而不是传递PL.Job.components[i].items[i]对象中这些对象的索引路径。

我很清楚目前的结构存在问题,但有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

有几点:

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

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

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