Search code examples
iosswiftios8plistfatal-error

poet.books throw fatal error: NSArray element failed to match


please help, this error broke my app. I have two classes: First Class-Poets

class Poets 
 {

    var poetName:String = ""
    var poetYearsOfLife:String = ""
    var poetImage:String = ""
    var poetBiography:String = ""
    var books=[Works]()
}

Second class Work

class Works 
{
    var nameWork:String = ""
    var workPoet:String = ""
}

TableViewController

var poetsPath = NSBundle.mainBundle().pathForResource("Poets1", ofType: "plist")
    var poetsArray = NSArray(contentsOfFile: poetsPath!)!
    var booksPath = NSBundle.mainBundle().pathForResource("Works1", ofType: "plist")
    var booksDict = NSDictionary(contentsOfFile: booksPath!)

    for poetArray in poetsArray
    {
        let poet=Poets()

        poet.poetName = poetArray["name"] as! String
        poet.poetImage = poetArray["image"] as! String
        poet.poetYearsOfLife=poetArray["yearsOfLife"] as! String
        poet.poetBiography=poetArray["biography"] as! String
           poets.append(poet)



        poet.books = booksDict![poet.poetName as String] as! [(Works)]//<---error
        for bookArray in poet.books {
            var book=Works()
           book.nameWork = "nameWork"



            }
    }

How I can fix this bug?

fatal error: NSArray element failed to match the Swift Array Element type

I have Work1.plist. I try to make a segue and to pass values from plist associated with a particular poetName from Poets1.plist in a table.Sorry for my bad English.

<plist version="1.0">
<dict>
<key>poet_name1</key>
<array>
    <dict>
        <key>nameWork</key>
        <string>Благовест</string>
        <key>work</key>
        <string>Среди дубравы</string>
    </dict>
</array>
<key>poet_name2</key>
<array>
    <dict>
        <key>nameWork</key>
        <string>Бессонные ночи</string>
        <key>work</key>
        <string>Какой кошмар!</string>
    </dict>
</array>
</dict>
</plist>

Solution

  • My suggestion is to add an initializer to your Works class:

    class Works {
    
        var nameWork = ""
        var workPoet = ""
    
        init(nameWork: String, workPoet: String) {
            self.nameWork = nameWork
            self.workPoet = workPoet
        }
    }
    

    Then you can use it like this:

    let worksArray = booksDict[poet.poetName as String] as! NSArray
    for work in worksArray {
        let dictionaryFromArray = work as! NSDictionary
        let workObject = Works(nameWork: dictionaryFromArray["nameWork"] as! String, workPoet: dictionaryFromArray["work"] as! String)
        poet.books.append(workObject)
    }