jdog
jdog

Reputation: 10759

Why am I getting Cannot convert value of type Bool to expected argument type String

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

Upvotes: 1

Views: 6403

Answers (1)

Rashwan L
Rashwan L

Reputation: 38833

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

Upvotes: 1

Related Questions