2017-07-22 2 views
0

J'ai donc lu des dictionnaires dans le livre officiel de Swift, mais je rencontre des problèmes en ce moment. Oui, il explique certaines choses simples que vous pouvez faire pour les dictionnaires tels que; check if the whole dictionary is empty ou change 1 value of 1 key, ou remove 1 value of 1 key. Pour démontrer les problèmes que je INTRODUISE, j'ai un petit bout de code:Quelle est la manière la plus propre de faire des modifications complexes aux dictionnaires dans Swift 4?

//: Dictionary Test 

import UIKit 

let mainDatabase = ["Albert Einstein": ["Alberts first quote", 
            "Alberts second quote", 
            "Alberts third quote"], 

        "Martin Luther King": ["Martins first quote", 
              "Martins second quote", 
              "Martins third quote"], 

        "Newton": ["Newton first quote", 
           "Newton second quote", 
           "Newton third quote"]] 

var database = mainDatabase // for later use 

func randomQuote(){ 
    //Make an array from all authors 
    var authorArray = Array(database.keys) 

    //Pick an author from that array 
    let author = (authorArray[Int(arc4random_uniform(UInt32(authorArray.count)))]) 

    //Make an array from the quotes belonging to the author we've picked 
    var quoteArray = database[author]! 

    let randomNumber = Int(arc4random_uniform(UInt32(quoteArray.count))) 

    //Pick a quote from that array 
    let quote = quoteArray[randomNumber] 
    print(quote) 
    print(author) 

    //Delete the chosen quote from the array 
    quoteArray.remove(at: randomNumber) 

    //Update the new array to the database 
    database.updateValue(quoteArray, forKey: author) 

    print(quoteArray) 
} 

for index in 1...6{ 
    randomQuote() 
} 

Alors tout d'abord avoir à prendre des choses du dictionnaire que la stocker dans un tableau et que le ramener au dictionnaire se sent vraiment maladroit. J'ai l'impression qu'il y a un moyen plus simple de le faire.

Ce code va générer un devis qui n'a pas été généré avant chaque fois que vous appelez la fonction randomQuote(), cependant, je pense que parce que le dictionnaire est non ordonné il donnera parfois une erreur fatale: dire Index hors de portée.

Je n'arrive pas à comprendre les dictionnaires et à travailler avec eux. Même après avoir lu un article de bazillion ... Quelqu'un at-il quelques conseils?

+0

* "il donnera parfois une erreur fatale: dire Index hors de portée" * - penser à ce qui se passe si le tableau de citation pour un auteur devient * vide. * –

Répondre

-1

Vous pouvez le faire façon très simple comme vous suffit de créer l'extension du Dictionnaire

STEP-1 Create Dictionary Extentions allow you to access dictionary key by index

extension Dictionary 
{ 
subscript(i:Int) -> (key:Key,value:Value) { 
get { 
return self[index(startIndex, offsetBy: i)]; 
} 
} 
} 

STEP-2 Use Dictionary Extension to choose random Quate

func randomQuote() 
{ 
    let randomAuthor = Int(arc4random_uniform(UInt32(database.count))) 
    let randomQuate = Int(arc4random_uniform(UInt32(database[randomAuthor].value.count))) 
    var quote = ((database[randomAuthor].value)[randomQuate]) 
    print(quote) 
    var temArray = database[randomAuthor].value 
    temArray.remove(at: randomQuate) 
    database.updateValue(temArray, forKey: database[randomAuthor].key) 
} 

SORTIE

Avant: - [ "Martin Luther King": ["Martins première citation", "Martins deuxième citation", "Martins troisième citation"], "Newton": ["N ewton première citation "," Newton deuxième citation "," Newton troisième citation "]," Albert Einstein ": [" Alberts première citation "," Alberts deuxième citation "," Alberts troisième citation "]]

Newton deuxième citation Après: - ["Martin Luther King": ["Martins première citation", "Martins deuxième citation", "Martins troisième citation"], "Newton": ["Newton première citation", "Newton troisième citation" ], "Albert Einstein": ["Alberts première citation", "Alberts deuxième citation", "Alberts troisième citation"]]

+0

puis-je savoir la raison pour laquelle downvoted ma réponse –