gpt4 book ai didi

ios - plist、数组和字典的元素之间是什么关系?

转载 作者:可可西里 更新时间:2023-11-01 04:46:54 25 4
gpt4 key购买 nike

我有一个简单的程序,它需要记录并持久存储每次用户在 TableView 中选择一个项目时生成的 2 条简单数据。这两条数据是 1) 点击的时间 (NSDate) 和 2) 点击的项目的名称 (NSString)。此时,这些信息是这样的形式:

TimerEvent *latestTappedEvent = [[TimerEvent alloc] init];
latestTappedEvent.timeTapped = NSDate.date;
latestTappedEvent.activityTapped = tappedItem.itemName;

这两个数据片段必须保持相互关联。

我的问题是:

如何按时间顺序将这些数据传入和传出 plist?

在我的研究中,我只会变得更加困惑。如何使用 plist 对我来说并不明显。最初,我认为我可以使用一个 NSMutableDictionary,以 latestTappedEvent.timeTapped 作为键,以 latestTappedEvent.activityTapped 作为值。但是当我尝试手动构建 plist 时,它似乎是不可能的,而是想要一个字符串作为键。

如果有人能帮助我理解这一点,最好是通过图形表示这些不同元素之间的关系,我将永远感激不已。

最佳答案

字典和数组都存储“事物”——存储的事物是通过使用“其他事物”对数据结构进行“查找”来检索和设置的。在数组中,该查找是存储对象的数组中的索引。表格形式:

Index       Storage

0 "some string stored at index 0"

1 "some other string"

2 <some other object, stored at index 2>

要查找 “存储在索引 0 处的一些字符串”,您需要知道它存储在索引 0 处,并向数组询问该索引处的对象。所以数组使用整数来查找其中存储的对象,而这些整数必须在0到数组的计数减1的范围内。使用整数来查找数组中的项目也给出了数组顺序——从上到下- 您在上表中看到的底部排序与代码迭代产生的顺序相同。

字典使用任意对象进行查找,这也意味着字典中没有顺序,只有一组键及其所指的关联。表格形式:

Key         Storage

"name" "a string that will be accessed using the key 'name'"

"number" <some numeric object, that will be accessed using the key 'number'>

<object> "will be accessed with key <object> which is an arbitrary object"

要从此字典中获取 “将使用键 'name' 访问的字符串”,您向字典询问键 “name” 下存储的内容.

在上面的示例中,我给出了表标题“Index - Storage”或“Key - Storage”,但是回过头来看,这些结构都存储了可以使用其他东西访问的东西,让我们查看数组一个更通用的表格:

Thing used to access the thing that's stored        Thing that's stored

0 "some string stored at index 0"

1 "some other string"

2 <some other object, stored at index 2>

同样,字典,具有相同的表格:

Thing used to access the thing that's stored        Thing that's stored

"name" "a string that will be accessed using the key 'name'"

"number" <some numeric object, that will be accessed using the key 'number'>

<object> "will be accessed with key <object> which is an arbitrary object"

此外,让我们在同一个表中查看您的类 TimerEvent:

Thing used to access the thing that's stored                Thing that's stored

timeTapped <date object>

activityTapped "name of an activity"

左栏中的项目是 Objective-C 属性名称,右栏中的项目是这些属性包含的值。现在,再看一下字典——左边的项目是任意值(实际上它们通常是字符串),右边的项目是其他任意值。希望你能看到这里的联系——你通常可以将一个对象的属性表示为一个字典,它将属性名称的字符串表示映射到属性存储的值。所以,如果你想在字典中表示 TimerEvent 对象,你最终会得到如下表示:

Key                 Object

"timeTapped" <date object>

"activityTapped" "activity name"

上表说明了数组、字典和其他对象之间的共性和差异,并表明使用字典将属性名称映射到属性值可以表示任何给定对象的属性。那么,执行此操作的代码看起来如何?假设我们要在 NSDictionary 中表示 TimerEvent 对象 timerEvent:

NSDictionary *timerEventRepresentation = @{ @"timeTapped": timerEvent.timeTapped,
@"activityTapped": timerEvent.activityTapped};

下面是我们如何根据字典表示创建 TimerEvent:

TimerEvent *timerEvent = [[TimerEvent alloc] init];
timerEvent.timeTapped = timerEventDictionaryRepresentation[@"timeTapped"];
timerEvent.activityTapped = timerEventDictionaryRepresentation[@"activityTapped"];

将所有对象强制转换为字典的目的是属性列表格式仅序列化几个类 - NSArrayNSDictionaryNSStringNSDateNSNumberNSData。因此,我们编写代码来使用受支持的类来表示不受支持的类,反之亦然,以在 plist 中序列化这些对象。

作为附录,您提到您需要存储所有点击的记录,并对它们进行排序。正如我上面提到的,数组本质上是对它们存储的东西进行排序,所以这是合适的解决方案。你会想要构建看起来像这样的东西:

Index        Item
0 <dictionary representing first tap>
1 <dictionary representing second tap>
...
n <dictionary representing n-1th tap>

在代码中,序列化每个点击将采用与前面描述的相同的形式,但请确保添加一个额外的步骤,即在 NSMutableArray 属性上调用 addObject:新创建的字典作为参数。

关于ios - plist、数组和字典的元素之间是什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com