Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么是王国;“对许多人来说”;关系始终具有相同的引用?_Swift_One To Many_Realm - Fatal编程技术网

Swift 为什么是王国;“对许多人来说”;关系始终具有相同的引用?

Swift 为什么是王国;“对许多人来说”;关系始终具有相同的引用?,swift,one-to-many,realm,Swift,One To Many,Realm,为什么领域列表包含相同的元素而不是不同的元素 如下图所示,有两个relam对象(UndoMemoryNameEntry和NameEntry)。第一个包含8个元素的列表。列表的元素类型为NameEntry类型 我的姓氏条目对象是用currentScorePlayer=1和currentScoreMe=15编写的,如下图所示: UndoMemoryNameEntry中的列表已正确插入last NameEntry对象。您可以在更下方找到插入代码。。。 但现在的问题是:为什么所有现有的列表元素也都被

为什么领域列表包含相同的元素而不是不同的元素

如下图所示,有两个relam对象(UndoMemoryNameEntry和NameEntry)。第一个包含8个元素的列表。列表的元素类型为NameEntry类型

我的姓氏条目对象是用currentScorePlayer=1和currentScoreMe=15编写的,如下图所示:

UndoMemoryNameEntry中的列表已正确插入last NameEntry对象。您可以在更下方找到插入代码。。。 但现在的问题是:为什么所有现有的列表元素也都被更改为最新插入的元素????正如你在下图中看到的,不幸的是,所有元素都与最后添加的元素相同-为什么

如果我将NameEntry更改为以下内容:

并在索引=0处插入列表,则列表更改为:

为什么所有的元素都变了?而不仅仅是插入的那个???谢谢你在这方面的帮助

我的两个领域对象是:

class NameEntry: Object {
    dynamic var playerName = ""
    dynamic var isMyAdversary: Bool = false
    dynamic var currentScorePlayer: Int = 0
    dynamic var currentScoreMe: Int = 0
}
名单如下:

class UndoMemoryNameEntry: Object {
    dynamic var undoPlayerName = ""
    let NameEntryList = List<NameEntry>()
}
let undoPredicate = NSPredicate(format: "undoPlayerName == %@", plaNameLab)
let undoPlayerName = rlm.objects(UndoMemoryNameEntry).sorted("undoPlayerName", ascending: true).filter(undoPredicate)
if (undoPlayerName.count == 1) {                    
    rlm.beginWrite()
    println(entry)
    var undoEntry = undoPlayerName[0] as UndoMemoryNameEntry
    undoEntry.NameEntryList.insert(entry, atIndex: 0)
    rlm.commitWrite()
}
let predicate = NSPredicate(format: "playerName == %@", plaNameLab)
let playerName = rlm.objects(NameEntry).sorted("playerName", ascending: true).filter(predicate)
if (playerName.count == 1) {                    
    rlm.beginWrite()
    var entry = playerName[0] as NameEntry

    // you need to create a new list object first !!!!!!!!!!!!
    // ...in my initial example, this creation was missing !!!!!!
    var siblingEntry = UndoMemoryNameEntry()

    siblingEntry.undoPlayerName = plaNameLab
    siblingEntry.currentScorePlayer = entry.currentScorePlayer
    siblingEntry.currentScoreMe = entry.currentScoreMe

    // insert new list-element
    entry.undoEntryList.insert(siblingEntry, atIndex: 0)

    // alternatively choose append if you want to add the element at the end of the list
    entry.undoEntryList.append(siblingEntry)

    // or choose the "ringbuffer-solution" given in the add-on below if you want to restrict the number of list-elements to ringbuffer-size !
    // ...

    rlm.commitWrite()
}

上面的代码excert工作得很好——除了领域列表总是将其所有元素更改为刚刚插入的元素

我终于找到了一个解决方案:

首先,按如下方式重新排列两个领域对象:

class NameEntry: Object {
    dynamic var playerName = ""
    dynamic var currentScorePlayer: Int = 0
    dynamic var currentScoreMe: Int = 0

    // the undo-list is better placed in the first object...
    let undoEntryList = List<UndoMemoryNameEntry>()

    override static func primaryKey() -> String? {
        return "playerName"
    }
}

class UndoMemoryNameEntry: Object {
    dynamic var undoPlayerName = ""
    dynamic var currentScorePlayer: Int = 0
    dynamic var currentScoreMe: Int = 0

    // no primary key here since the undoEntry will have several items with the same undoPlayerName
}
加载项:如果要创建仅具有有限数量列表元素的ringbuffer:

// create ringbuffer of 20 elements (20th element will be newest)
let ringBufferSize = 20
let undoPredicate = NSPredicate(format: "undoPlayerName == %@", plaNameLab)

if (entry.undoEntryList.filter(undoPredicate).sorted("undoPlayerName").count < ringBufferSize) {

    entry.undoEntryList.append(siblingEntry)
}
else {

    // entry.undoEntryList.replace(ringBufferSize-1, object: siblingEntry)
    entry.undoEntryList.removeAtIndex(ringBufferSize-1)
    entry.undoEntryList.append(siblingEntry)

    for index in 0..<ringBufferSize-1 {
        let tempEntry1 = rlm.objects(UndoMemoryNameEntry).filter(undoPredicate).sorted("undoPlayerName")[index] as UndoMemoryNameEntry
         let tempEntry2 = rlm.objects(UndoMemoryNameEntry).filter(undoPredicate).sorted("undoPlayerName")[index+1] as UndoMemoryNameEntry
         tempEntry1.currentScorePlayer = tempEntry2.currentScorePlayer
         tempEntry1.currentScoreMe = tempEntry2.currentScoreMe
     }

     let tempEntry = rlm.objects(UndoMemoryNameEntry).filter(undoPredicate).sorted("undoPlayerName")[ringBufferSize-1] as UndoMemoryNameEntry
     rlm.delete(tempEntry)
 }
//创建20个元素的ringbuffer(第20个元素将是最新的)
让ringBufferSize=20
让undoPredicate=NSPredicate(格式:“undoPlayerName==%@”,plaNameLab)
if(entry.undoEntryList.filter(undoPredicate).sorted(“undoPlayerName”).count// create ringbuffer of 20 elements (20th element will be newest)
let ringBufferSize = 20
let undoPredicate = NSPredicate(format: "undoPlayerName == %@", plaNameLab)

if (entry.undoEntryList.filter(undoPredicate).sorted("undoPlayerName").count < ringBufferSize) {

    entry.undoEntryList.append(siblingEntry)
}
else {

    // entry.undoEntryList.replace(ringBufferSize-1, object: siblingEntry)
    entry.undoEntryList.removeAtIndex(ringBufferSize-1)
    entry.undoEntryList.append(siblingEntry)

    for index in 0..<ringBufferSize-1 {
        let tempEntry1 = rlm.objects(UndoMemoryNameEntry).filter(undoPredicate).sorted("undoPlayerName")[index] as UndoMemoryNameEntry
         let tempEntry2 = rlm.objects(UndoMemoryNameEntry).filter(undoPredicate).sorted("undoPlayerName")[index+1] as UndoMemoryNameEntry
         tempEntry1.currentScorePlayer = tempEntry2.currentScorePlayer
         tempEntry1.currentScoreMe = tempEntry2.currentScoreMe
     }

     let tempEntry = rlm.objects(UndoMemoryNameEntry).filter(undoPredicate).sorted("undoPlayerName")[ringBufferSize-1] as UndoMemoryNameEntry
     rlm.delete(tempEntry)
 }