1

Getting several "Cannot convert value of type Bool to expected argument type String" errors. The method for encoding expects a string but it is getting a Bool?

Here is the code. See the attached image for errors.

import Foundation

class Restaurant {
    var name = ""
    var item = ""
    var location = ""
    var image = ""
    var isVisited = false
    var phone = ""
    var rating = ""

    init(name: String, item: String, location: String, phone: String, image: String, isVisited: Bool) {
        self.name = name
        self.item = item
        self.location = location
        self.phone = phone
        self.image = image
        self.isVisited = isVisited
    }

    class func makeNewsItem(_ notificationDictionary: [String: AnyObject]) -> Restaurant? {
        if let name = notificationDictionary["name"] as? String,
            let phone = notificationDictionary["phone"] as? String,
            let location = notificationDictionary["location"] as? String {
            let date = Date()
            let image = ""
            let visited = false
            let item = ""

            let newsItem = Restaurant(name: name, item: item, location: location, phone: phone, image: image, isVisited: visited)

            NotificationCenter.default.post(name: Notification.Name(rawValue: RestaurantTableViewController.RefreshNewsFeedNotification), object: self)
            return newsItem
        }
        return nil
    }
}

extension Restaurant: NSCoding {
    struct CodingKeys {
        static var Name = "name"
        static var Item = "item"
        static var Location = "location"
        static var Image = "image"
        static var IsVisited:Bool = false
        static var Phone = "phone"
        static var Rating = "rating"
    }

    convenience init?(coder aDecoder: NSCoder) {
        if let name = aDecoder.decodeObject(forKey: CodingKeys.Name) as? String,
            let location = aDecoder.decodeObject(forKey: CodingKeys.Location) as? Date,
            let phone = aDecoder.decodeObject(forKey: CodingKeys.Phone) as? String {

            let date = Date()
            let image = aDecoder.decodeObject(forKey: CodingKeys.Image) as? String
            let visited:Bool = aDecoder.decodeBool(forKey: CodingKeys.IsVisited) as? String
            let item = aDecoder.decodeObject(forKey: CodingKeys.Item) as? String

            self.init(name: name, item: item, location: location, phone: phone, image: image, isVisited: visited)
        } else {
            return nil
        }
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: CodingKeys.Name)
        aCoder.encode(location, forKey: CodingKeys.Location)
        aCoder.encode(phone, forKey: CodingKeys.Phone)
        aCoder.encode(item, forKey: CodingKeys.Item)
        aCoder.encode(image, forKey: CodingKeys.Image)
        aCoder.encode(isVisited, forKey: CodingKeys.IsVisited)
        aCoder.encode(rating, forKey: CodingKeys.Rating)
    }
}

enter image description here

0

1 Answer 1

1

You can´t add a bool value to the forKey. This has to be a string value, so change it from:

aCoder.encode(isVisited, forKey: CodingKeys.IsVisited)

To:

aCoder.encode(isVisited, forKey: "IsVisited")

Same for:

let visited:Bool = aDecoder.decodeBool(forKey: CodingKeys.IsVisited) as? String

To:

let visited:Bool = aDecoder.decodeBool(forKey: "IsVisited") // note, no need for as? String here
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.