Swift Dictionary Error

I have a rather big Dictionary with words, and this builds just fine. However, when I run the code that's supposed to use words from this dictionary, I get an error from the dictionary. To be more specific; I get an EXC Bad Instruction error. It may be worth telling that my dictionary has probably over 600 words, and from what it seems it doesn't have any errors. What I discovered though, is when I tried to shrink the dictionary size by half it size it worked. Then I slowly started adding words again, until it hit (what I would guess) was around 350 words when I got the error. Then I again tried to remove the 350th words, so I was left with only 349 words - then the error was gone again - and my app ran fine.


Any solutions to this? I have to store big amount of words, but I'm not sure what to use when I can't use dictionary. And may this really be the case? Do these dictionary have a max size?


Answers would be greatly appreciated.

Answered by OOPer in 68741022

You may hit the bug of Swift. Having your dictionay as a resource will let you avoid this bug.

Add a new File to your project, and the file is automatically marked as bundle resource by Xcode.

replaceWords.json:

{
    "abc": "def",
   ...
    "uvw": "xyz"
}

(Caution in case you are not familiar with JSON: use a pair of curly braces ('{'. '}'), replace `...` with your `"Word":"replaceWord",` pairs, no comma after the last pair.)


You need a few lines to read it: (somewhere in your Swift code)

        let dictURL = NSBundle.mainBundle().URLForResource("replaceWords", withExtension: "json")!
        let replaceData = NSData(contentsOfURL: dictURL)!
        let replaceWords = try! NSJSONSerialization.JSONObjectWithData(replaceData, options: [])
        let myDictionary = replaceWords as! [String : String]
        print(myDictionary)

Make it a try.

It would help if you could post code for a minimal, reproducible test case.

This is pretty much the code I have:


    let myDictionary = [
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord",
        "Word":"replaceWord"
    ]

Except it's other words. Just a big dictionary of words. How come I get an error out of this? And when you try to shrink the content, with let's say 10 lines - it works fine? As far as I am concerned, this is the right way to use dictionaries? and yes - I have also tried to use : Dictionary<String, String> as well, but with no luck.

Accepted Answer

You may hit the bug of Swift. Having your dictionay as a resource will let you avoid this bug.

Add a new File to your project, and the file is automatically marked as bundle resource by Xcode.

replaceWords.json:

{
    "abc": "def",
   ...
    "uvw": "xyz"
}

(Caution in case you are not familiar with JSON: use a pair of curly braces ('{'. '}'), replace `...` with your `"Word":"replaceWord",` pairs, no comma after the last pair.)


You need a few lines to read it: (somewhere in your Swift code)

        let dictURL = NSBundle.mainBundle().URLForResource("replaceWords", withExtension: "json")!
        let replaceData = NSData(contentsOfURL: dictURL)!
        let replaceWords = try! NSJSONSerialization.JSONObjectWithData(replaceData, options: [])
        let myDictionary = replaceWords as! [String : String]
        print(myDictionary)

Make it a try.

Thank you so unbelievably much. I have struggled with this for DAYS. Saved me a lot of time, and helped me very much. Thank you so much!

I had a large dictionary (715 entries, 370Kb on disk) that I thought was broken, but it just turned out that it was taking the playground an extremely long time to load and parse it. I broke it into its own class and included it, similar to the suggestion above but not using JSON. This seems to have solved the problem.

Swift Dictionary Error
 
 
Q