【问题标题】:Dictionary with values as array on appending one at a time, remains empty一次附加一个值作为数组的字典,保持为空
【发布时间】:2018-06-04 10:11:27
【问题描述】:

在 ARKit 中,我要做的是收集场景中放置的一堆节点位置,然后将它们平均出来,这样节点的移动就不会像使用 ARKit 时那样抖动。因此,我有一个变量声明并初始化为字典,其值为 vector_float3 数组。 (我认为这更像是一个 Swift 问题而不是 ARKit 问题,是吗?)

var extentOfnodesAddedInScene: [SCNNode: [vector_float3]] = [:] 

这与 SceneKit/ ARKit 有关。在不断检测和更新水平面的渲染器函数中,我想在其中附加 vector_float3 数组。

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
    ...
    extentOfnodesAddedInScene[node]?.append(planeAnchor.center)

但是在打印出来时,我得到了一个空字典,即 [:]

当我与整个数组同时更新时,我已经声明并初始化了另一种类似的 var var nodesAddedInScene: [SCNNode: [vector_float3]] = [:],它工作正常。

nodesAddedInScene[node] = [planeAnchor.center, planeAnchor.extent]

因为在最后一个 var 中只有两个值,所以没问题。但是对于前一个,我希望字典中的数组是动态更新的。任何关于如何实现这一目标的指示都会非常有帮助。

【问题讨论】:

  • 确保在尝试追加元素之前使用空数组初始化extentOfnodesAddedInScene[node]。它可能为零。
  • 抱歉,它是extendOfNodes ...我已经将它初始化为空字典。你的意思是我应该在其中初始化 vector_float3 的数组吗?如:var extentOfnodesAddedInScene: [SCNNode: [vector_float3]] = [:[]] ?这不起作用。
  • 我说用空数组初始化密钥node
  • 再次道歉,如果我很痛苦。我理解将空字典初始化为 [:]。我确实理解将空字典初始化为 [[key: value]]()。但是,这是一个数组字典,而不是相反。我不确定如何以不同于代码中当前的方式初始化它。
  • 试试extentOfnodesAddedInScene[node, default: []]?.append(planeAnchor.center)

标签: arrays swift dictionary arkit


【解决方案1】:

您可以使用带有默认值的 Swift 4 Dictionary 基于键的下标来使用空数组初始化您的数组,以便即使在其键尚未定义任何值时也能够追加到它。只需确保您的字典值类型是数组[SCNNode: [vector_float3]]

extentOfnodesAddedInScene[node, default: []].append(planeAnchor.center)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 2017-09-07
    • 2017-08-18
    • 2011-03-13
    • 1970-01-01
    • 2021-01-21
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多