2016-08-05 1 views
3

Ich mache eine App, die Pokemon und ihre Typen zeigt. Auch ein Teil der App zeigt ihre Schwächen.Wie filtere ich ein Wörterbuch und Ausgabeergebnis in CollectionViewController in swift

ich eine globale Variable, die alle Pokemon auflistet, die wie folgt aussieht:

var objects = [ 
{ 
"id": "001", 
"typeTwo": "Poison", 
"name": "Bulbasaur", 
"type": "Grass" 
}, 
{ 
"id": "002", 
"typeTwo": "Poison", 
"name": "Ivysaur", 
"type": "Grass" 
}, 
{ 
"id": "025", 
"typeTwo": "", 
"name": "Pikachu", 
"type": "Electric" 
}] 

etc ...

Wenn der Benutzer wählt ein Pokemon aus dem 1. VC, drücken sie dann ein Taste und es passiert das Objekt dieses Pokemon zu meinem CollectionViewController - und speichert diese in var selectedPokemonObject = [String:String]()

ich habe meine CollectionViewController einrichten, um dann meine Pokemon Objekte zu filtern und nur Pokemon angezeigt werden, die den Typ o entsprechen f Pokemon, das der Benutzer ausgewählt hat. Zum Beispiel:

Der Benutzer wählt: Pikachu (Typ "Electric")

Der Benutzer geht dann zu dem CollectionViewController und alle Pokemon vom Typ "Electric" gezeigt. Einige meiner Code für das heißt:

var filteredObjects = [[String:String]]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    filteredObjects = objects.filter{ 

     let valueType = $0["type"] 
     let valueTypeTwo = $0["typeTwo"] 

     if (valueType == selectedPokemonObject["type"] || valueType == selectedPokemonObject["typeTwo"]) && (valueTypeTwo == selectedPokemonObject["typeTwo"] || valueTypeTwo == selectedPokemonObject["type"]) 
     { 

      return true 
     } 

     return false 
    } 
} 

ich dann die Zelleninformationen in der cellForItemAtIndexPath wie folgt festgelegt:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell 

    let object = filteredObjects[indexPath.row] 

    cell.pokemonName.text = object["name"]! 
    cell.pokemonImage.image = UIImage(named: "\(object["id"]!)"+"\(object["name"]!)"+"_small") 

    return cell 

} 

All dies funktioniert.

Was ich als ein

Statt der CollectionViewController zeigt Pokemon des gleichen Typs passieren möchte der Benutzer ausgewählt, würde Ich mag es Pokemon zu zeigen, dass eine Art hat, die ich definieren. Zum Beispiel:

Der Benutzer wählt: Pikachu ("type": "Electric")

Der Benutzer geht dann zu den CollectionViewController und alle Pokemon vom Typ "Ground" gezeigt. Oder ein komplexerer Fall:

Der Benutzer wählt: Bulbasaur ("type": "Grass" und "typeTwo": "Poison")

Der Benutzer geht dann zum CollectionViewController und alle Pokemon vom Typ "Fire", "Ice", "Flying" und "Psychic" gezeigt sind.

Ich habe wirklich Schwierigkeiten, dies herauszufinden, so dass jede Hilfe geschätzt wird. Ich habe Switch-Anweisungen angeschaut, bin mir aber nicht sicher, ob dies der richtige Ansatz ist. Danke

+0

Wenn der Pokemon einen einzigen Typ hat, ist das "typeTwo" -Feld null? –

+0

@HaydenHolligan '" typeTwo "' ist dann nur ein leerer 'String' - Ich habe meine Frage oben geändert, um ein Pokemon zu zeigen, das nur einen Typ hat, so dass du es sehen kannst. Danke – Nick89

Antwort

1

Mein bevorzugter Ansatz wäre, zunächst ein Wörterbuch einzurichten, das die Pokemon enthält, die für jeden Typ schwach sind. Ich würde dies tun, um die Liste der schwachen Pokémon zu erhalten, ohne die gesamte Liste von Pokémon zu durchlaufen (O (1) Zeit statt O (N), wenn Sie die Groß-O-Notation kennen).

In einem separaten Swift Befehlszeilen Projekt,

//Assuming objects is setup similar to below 
var objects = [ 
    ["id": "001", 
     "typeTwo": "Poison", 
     "name": "Bulbasaur", 
     "type": "Grass"], 
    ["id": "002", 
     "typeTwo": "Poison", 
     "name": "Ivysaur", 
     "type": "Grass"], 
    ["id": "025", 
     "typeTwo": "", 
     "name": "Pikachu", 
     "type": "Electric"]] 

var pokemonTypeDefenseChart = [String: [String]]() 
pokemonTypeDefenseChart["Grass"] = ["Fire", "Ice", "Flying"] 
pokemonTypeDefenseChart["Poison"] = ["Psychic", "Ground"] 
pokemonTypeDefenseChart["Electric"] = ["Ground"] 
// Setup rest of the weaknesses (this part is manual unfortunately) 

var pokemonWeaknessChart = [String: [String]]() 

func getWeaknesses(type: String, name: String) { 
    for weakness in pokemonTypeDefenseChart[type]! { 
     if pokemonWeaknessChart[weakness] == nil { 
      pokemonWeaknessChart[weakness] = [] 
     } 
     pokemonWeaknessChart[weakness]?.append(name) 
    } 
} 

for object in objects { 
    if let type = object["type"] where !type.isEmpty, let name = object["name"] { 
     getWeaknesses(type, name: name) 
    } 

    if let typeTwo = object["typeTwo"] where !typeTwo.isEmpty, let name = object["name"] { 
     getWeaknesses(typeTwo, name: name) 
    } 
} 

print(pokemonWeaknessChart) 

Dieser Code sollte die gesamte Liste der Pokemon Schwächen ausgegeben. Sie können diese Ausgabe direkt in Ihr Projekt als neue Variable kopieren (wahrscheinlich gespeichert, wo Ihre objects gespeichert sind).

So jetzt, wenn Sie ein Pokemon wählen, wird dieser Code unten die vollständige Liste der schwachen Pokemon valueType und valueTypeTwo zurückgeben.

let valueType = "Fire" 
let valueTypeTwo = "Electric" 

var pokemonWeaknesses = pokemonWeaknessChart[valueType] 
if !valueTypeTwo.isEmpty, let pokemonTypeTwoWeaknesses = pokemonWeaknessChart[valueTypeTwo] { 
    pokemonWeaknesses?.appendContentsOf(pokemonTypeTwoWeaknesses) 
} 
+0

Danke für deine Antwort. Ich habe Mühe zu sehen, wie das schon in meinen Code passt. Könntest du es ein bisschen mehr aufschlüsseln und erklären, wo ich meinen Code platzieren muss? Vielen Dank! – Nick89

+0

Entschuldigung, ich habe vergessen, den Teil hinzuzufügen, wo Sie tatsächlich die Pokemon erhalten, die super effektiv sind. Ich werde meine Antwort aktualisieren, aber ich denke, es wird die beste Leistung sein, wenn Sie ein Wörterbuch mit entweder "stark" oder "schwach" für den Schlüssel erstellen, und ein Wörterbuch für den Wert. Das innere Wörterbuch würde die Pokémon für den Schlüssel eingeben. Auf diese Weise können Sie die Liste der Pokemon, die gegen einen bestimmten Typ entweder stark oder schwach sind, in fast sofortiger Zeit erhalten. Andernfalls müssen Sie den gesamten Pokedex jedes Mal durchlaufen, wenn Sie Schwächen finden möchten. –

+0

Dies wird ein wenig komplex, also werde ich meine Antwort aktualisieren, wenn ich heute Abend nach Hause komme –

Verwandte Themen