尝试将值附加到字典中的数组

时间:2017-02-14 20:47:04

标签: arrays swift dictionary

我试图将元素添加到Dictionary中定义的数组中,如下所示:

var eventsByQuarter = Dictionary<Int, [D_MatchEvents]>()

字典包含体育比赛中事件的详细信息,其中关键是比赛的四分之一。即,第1季度的每个事件都在分配给该词典项目的数组中(我稍后将使用该词典作为具有4个部分的表格视图的数据源)。

D_MatchEventsCore Data定义,与MatchData实体具有多对一关系。季度&#39;对于每个事件,已被捕获为MatchEvents实体中的一个属性。

func loadMatchEvents() {
    match = DatabaseController.fetchMatch(matchUUID)!
    matchEvents = match?.r_ToEvents?.allObjects as! [D_MatchEvents]
    matchEvents = matchEvents.sorted() {($0.d_EventTimestamp?.compare($1.d_EventTimestamp as! Date) == .orderedAscending)}

    for event in matchEvents {
        eventsByQuarter[event.d_EventQuarter] = eventsByQuarter.append(event)
    }
}

matchEvents被正确加载为D_MatchEvents类型的排序数组,但是当我尝试遍历数组时,将每个事件附加到正确的&#34; quarter&#34;字典中的数组在尝试引用成员&#39;下标时,我得到一个模棱两可的错误。

我看不出我是如何做到这一点的。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

鉴于你的词典的结构,问题在于:

for event in matchEvents {
    eventsByQuarter[event.d_EventQuarter] = eventsByQuarter.append(event)
}

应该是:

for event in matchEvents {
    eventsByQuarter[event.d_EventQuarter]?.append(event)
}

虽然您确实需要检查是否给定键的现有数组,所以我做了类似的事情:

for event in matchEvents {
    //Create a variable that is either a mutable copy of the existing array, or a new, empty array of the correct type
    var thisQuarter = eventsByQuarter[event.d_eventQuarter] ?? [D_MatchEvents]()
    //Add the new item
    thisQuarter.append(event)
    //Replace the existing array with the appended copy, or add a new key-value pair (if it didn't already exist)
    eventsByQuarter[event.d_eventQuarter] = thisQuarter
}

效率不高,但它是一种快速实施

答案 1 :(得分:0)

谢谢你。它让我进一步深入了解它。我现在找到了解决方案。实际上,我需要做的是将键定义为自己的变量,而不是直接引用数组的元素。所以代码现在看起来像这样

    for event in matchEvents {
        let qtr:Int = Int(event.d_EventQuarter)
        eventsByQuarter[qtr]?.append(event)
    }

我不确定为什么会这样,但它确实有效。使用SWIFT仍然可以发现许多谜团之一!关于你在追加之前检查字典项是否存在的其他评论,我完全同意其他情况,但是在这里,我知道总有4个项目,不多也不少,所以选择简单地初始化它们一开始,就不需要进一步检查了。我只是在循环遍历数组之前设置字典。

       for index in 1...4 { eventsByQuarter[index] = [] }