Arrays 如何不为领域列表中的元素获取不同的内存地址?

Arrays 如何不为领域列表中的元素获取不同的内存地址?,arrays,swift,realm,memory-address,Arrays,Swift,Realm,Memory Address,如果我在Swift中迭代数组,使用: for element in array { ... } 并在for语句中放置一个断点,查看存储为元素的对象的地址,得到的地址与让调试器运行表达式时的地址不同: array.first 数组中只有一个元素。那么,为什么我得不到相同的地址呢? 以下是正在运行的调试器的屏幕截图: 我正在迭代邮件的附件。当我调试时,邮件只有一个附件。调试器也在第一次迭代中停止。在我的两个表达式中,您可以看到,该附件比attachments.first有另一个地址 我

如果我在Swift中迭代数组,使用:

for element in array {
    ...
}
并在for语句中放置一个断点,查看存储为元素的对象的地址,得到的地址与让调试器运行表达式时的地址不同:

array.first
数组中只有一个元素。那么,为什么我得不到相同的地址呢? 以下是正在运行的调试器的屏幕截图:

我正在迭代邮件的附件。当我调试时,邮件只有一个附件。调试器也在第一次迭代中停止。在我的两个表达式中,您可以看到,该附件比attachments.first有另一个地址

我不知道这是否有用或重要,但消息是由领域管理的对象,附件也是。message.attachments属于列表类型

编辑: 我进一步调查,结果变得更奇怪了。 我有一个类消息,它是一个领域对象,有一个附件的属性列表,这些附件也是领域对象

import RealmSwift
class Message: Object {
    let attachments = List<Attachment>()
    ...
}
class Attachment: Object {
    ...
}
导入RealmSwift
类消息:对象{
让附件=列表


这与我期望的不一样。

领域
列表
不是Swift
数组
s。列表
中的对象实际上是围绕指向数据库中逻辑对象位置的指针的包装,每次检索
列表
的元素时都会重新创建


Realm不保证来自对象检索api的Realm对象实例在指针比较的基础上是否相等;我们所做的任何语义保证都与数据库本身中对象的标识有关。(数据库中的单个给定对象可能由许多
对象
实例表示,每个实例可能是不同的Swift对象,但都指向相同的底层领域对象。)

尽管我还不完全理解,为什么两周前一切都按预期运行,而不需要覆盖函数,利用领域函数isSameObject帮助我解决了问题

class Attachment: Object {

    override func isEqual(_ object: Any?) -> Bool {
        return self.isSameObject(as: object as? Object)
    }
}

为什么要关心内存地址呢?当您访问服务器时,可能会创建一个新的代理实例array@D因为在另一个地方,我也使用了相同的attachments数组,我想找出附件的索引,它返回nil,因为它似乎是另一个实例。@EpicPandaForce你能不能e解释“proxy”的含义?@tosi问题很可能不是由内存地址差异引起的。领域列表不是像Swift数组那样的简单集合,这一事实很容易导致内存地址差异。您应该编辑此问题来解释您正在尝试做什么以及它如何不工作您使用或创建新问题并删除此问题的代码,因为您想要实现的目标似乎与您在问题中解释的目标完全不同。感谢您的详细回答。我想我理解您所写的内容,但这并不能解释为什么在列表的同一索引处比较两个元素返回false。您可以n请参见我的屏幕截图,我创建了一个表达式:
message.attachments.first==message.attachments.first
。顺便说一句,Attachment类不会覆盖==运算符。这是因为getter没有给您提供对现有Swift对象的引用,而是每次指向任何数据库对象时都会创建一个新的Swift对象存在于该索引中。