【问题标题】:Swift - Custom object found nil even though objectId is accurateSwift - 即使 objectId 准确,自定义对象也找不到
【发布时间】:2017-03-20 11:46:26
【问题描述】:
        let parent = path[row-1]
        let child = path[row]

        let indexOfChild = matrix[parent.objectId!]!.index(of: child)

        print("indexOfChild = \(indexOfChild)")
        print("keyValuePair = \(matrix[parent.objectId!]!)")
        print("child = \(child)")

        let indexAfter =  matrix[parent.objectId!]!.index(after: indexOfChild!)

因此,我在控制台中打印了此信息。

如您所见,keyValuePair 中存在“child”(即带有 argumentText:“example”的参数对象)(它们具有相同的 objectId)。然而,它在 keyValuePair 中的索引在控制台中显示为零。显然,唯一的区别是:“child”旁边有 “0x608000333f60”,而 keyValuePair 中的第二个参数对象有 “0x600000321a40”

我不知道这些的目的以及它们是如何计算的,但在我看来索引是零,因为这些代码彼此不同

我已经尝试修复它太久了。有人可以帮我解决吗?


indexOfChild = nil
keyValuePair = [<Argument: 0x608000334e60, objectId: IG9ekqMRw9, localId: (null)> {
    ACL = "<PFACL: 0x60800042f200>";
    argumentText = "the only thing is I can't get over how I feel when it ";
    creatorId = hWRXoRvnYd;
    level = 4;
    parentId = j7GkpwUKsm;
    reach = 0;
    threadId = Dtq632QYJ2;
}, <Argument: 0x600000321a40, objectId: 56AsB1juNP, localId: (null)> {
    ACL = "<PFACL: 0x600000235440>";
    argumentText = "example ";
    creatorId = hWRXoRvnYd;
    level = 4;
    parentId = j7GkpwUKsm;
    reach = 0;
    threadId = Dtq632QYJ2;
}]
child = <Argument: 0x608000333f60, objectId: 56AsB1juNP, localId: (null)> {
    ACL = "<PFACL: 0x608000235540>";
    argumentText = "example ";
    creatorId = hWRXoRvnYd;
    level = 4;
    parentId = j7GkpwUKsm;
    reach = 0;
    threadId = Dtq632QYJ2;
}
fatal error: unexpectedly found nil while unwrapping an Optional value

【问题讨论】:

    标签: swift parse-platform


    【解决方案1】:

    0x608000333f600x600000321a40 值是相关变量的内存地址位置。由于地址位置不同,我相信这两个子实例被视为两个单独的值,可能不会匹配。这可能就是您遇到的问题。

    最好通过唯一的 ID 值检查子实例的父实例,以便正确匹配父数组中的子实例。这有意义吗?

    您可以通过这种方式找到孩子的索引:

    var index = -1
    var found = false
    for chld in matrix[parent.objectId!]! {
        index = index + 1
        if chld.objectId == child.objectId {
            found = true
            break
        }
    }
    if found {
        // The index value at this point is the index for the child
    }
    

    您也可以简单地过滤子数组以在父数组中找到与 child 变量具有相同 objectId 的子数组,然后从子数组中查找索引,如下所示:

    let chld = matrix[parent.objectId!]!.filter{ $0.objectId == child.objectId }.first
    let indexOfChild = matrix[parent.objectId!]!.index(of: chld)
    

    【讨论】:

    • 感谢您的回复,但我不太明白您所说的唯一 ID 是什么意思。我认为 objectIds(每次创建新实例时都会自动给出)必须满足识别的需要实例的其余部分。我错了吗?当我从后端查询对象时,我没有办法简单地过滤掉内存地址位置吗?
    • 是的,您可以使用 objectId 作为唯一 ID。您可以执行类似于我将添加到上面的答案中的代码段来查找具有匹配 objectID 的孩子。
    • 非常感谢你,伙计!我花了一整天的时间才弄清楚这一点,多亏了你:)
    • 很高兴为您提供帮助 :) 如果有帮助,您能否将答案标记为“正确”?
    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多