2017-02-14 7 views
1

I in einem Wörterbuch definiert Elemente zu einem Array hinzuzufügen bin versucht, wie folgt:Der Versuch, Werte innerhalb eines Wörterbuchs auf ein Array anhängen

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

Das Wörterbuch die Details der Ereignisse in einem Sportspiel hält, wo der Schlüssel ist das Viertel des betreffenden Spiels. d.h. jedes Ereignis für das Viertel 1 ist in dem Feld, das diesem Wörterbuchelement zugewiesen ist (ich werde das Wörterbuch später als Datenquelle für eine Tabellenansicht mit 4 Abschnitten verwenden).

D_MatchEvents ist definiert durch Core Data und hat eine Viele-zu-eins-Beziehung mit einer MatchData Einheit. Das 'Quartal' für jedes Ereignis wird bereits als eines der Attribute innerhalb der MatchEvents Entität erfasst.

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 korrekt als sortiertes Array vom Typ D_MatchEvents, geladen, aber wenn ich versuche, durch das Array in einer Schleife jedes Ereignisses mit dem richtigen „Viertel“ Array im Wörterbuch Anhang I eine mehrdeutige Fehlermeldung erhalten, wenn zu verweisen versucht, Mitglied 'tiefgestellt'.

Ich kann nicht sehen, wie ich das erreichen kann. Jede Hilfe wäre willkommen.

+0

Ist 'd_EventQuarter' vom Typ' Int'? – shallowThought

+0

Tatsächlich ist es Typ Int16? wie Core-Daten Int nicht erlauben – Jonno

+0

Ich bin afk im Moment, aber ich nehme an, es zu entpacken wird den Fehler beheben. – shallowThought

Antwort

1

die Struktur Ihrer Definition Gegeben ist das Problem hier:

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

Obwohl Sie wirklich müssen überprüfen, um zu sehen, ob es noch ist ein:

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

Es ist wirklich sein sollte existierendes Array für den gegebenen Schlüssel, also würde ich etwas wie dieses tun:

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 
} 

Nicht super effizient, aber es ist eine schnelle Implementierung

0

Danke dafür. Es hat mich dazu gebracht, weiter darauf zu schauen. Ich habe jetzt die Lösung gefunden. Was ich eigentlich tun musste, war, den Schlüssel als eigene Variable zu definieren, anstatt direkt auf ein Element des Arrays zu verweisen. So sieht der Code nun so aus:

Ich bin nicht sicher, warum das der Fall sein würde, aber es funktioniert. Eines von vielen Mysterien, die mit SWIFT noch zu entdecken sind! In Bezug auf Ihren anderen Kommentar über die Überprüfung, ob ein Wörterbuchelement vor dem Anhängen existiert, stimme ich in anderen Fällen voll zu, aber hier weiß ich, dass es immer 4 Elemente geben wird, nicht mehr und nicht weniger, also habe ich einfach gewählt, sie von Anfang an zu initialisieren , dann ist keine weitere Überprüfung notwendig. Ich mache das vor dem Durchlaufen des Arrays, um das Wörterbuch einzurichten.

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