我试图将元素添加到Dictionary中定义的数组中,如下所示:
var eventsByQuarter = Dictionary<Int, [D_MatchEvents]>()
字典包含体育比赛中事件的详细信息,其中关键是比赛的四分之一。即,第1季度的每个事件都在分配给该词典项目的数组中(我稍后将使用该词典作为具有4个部分的表格视图的数据源)。
D_MatchEvents
由Core 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;下标时,我得到一个模棱两可的错误。
我看不出我是如何做到这一点的。任何帮助将不胜感激。
答案 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] = [] }