- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个简单的程序,它需要记录并持久存储每次用户在 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"];
将所有对象强制转换为字典的目的是属性列表格式仅序列化几个类 - NSArray
、NSDictionary
、NSString
、NSDate
、NSNumber
和 NSData
。因此,我们编写代码来使用受支持的类来表示不受支持的类,反之亦然,以在 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/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!