简体   繁体   中英

SwiftUI - Type 'Service' does not conform to protocol 'Decodable'

I'm playing around with SwiftUI on a little app I'm building but I'm running into an issue with Codable and I'm getting a few errors.

I have a JSON file which looks like this

[
    {
        "id": "",
        "name": "services",
        "items": [
            {
                "id": 0
                "businessName": "Some Name",
                "businessTelephone": "01234567890",
                "businessEmail": "email@gmail.com",
                "businessWebsite": "website.com",
                "businessLocation": { "latitude": "54.137256", "longitude": "-1.524727" },
                "travelLimit": 50,
                "description": "A description about some business",
                "categories": ["Category 1"]
            }
    }
]

I have a struct that looks like this

struct Service: Hashable, Codable, Identifiable { 

    var id: Int
    var businessName: String
    var businessTelephone: String
    var businessEmail: String
    var businessWebsite: String
    var businessLocation: Array<Any>
    var travelLimit: Int
    var description: String
    var categories: [Category]

    enum Category: String, CaseIterable, Hashable, Codable {

        case category1 = "Category 1"
        case category2 = "Category 2"

    }

}

However, I get the following errors

Type 'Service' does not conform to protocol 'Decodable'
Type 'Service' does not conform to protocol 'Encodable'
Type 'Service' does not conform to protocol 'Equatable'
Type 'Service' does not conform to protocol 'Hashable'

Codable can't have Any , plus businessLocation is a dictionary not an array, so Replace

var businessLocation: Array<Any>

with

var businessLocation:[String:String]

OR

Models

// MARK: - Element
struct Root: Codable {
    let id, name: String
    let items: [Item]
}

// MARK: - Item
struct Service: Codable {
    let id: Int
    let businessName, businessTelephone, businessEmail, businessWebsite: String
    let businessLocation: BusinessLocation
    let travelLimit: Int
    let itemDescription: String
    let categories: [String]

    enum CodingKeys: String, CodingKey {
        case id, businessName, businessTelephone, businessEmail, businessWebsite, businessLocation, travelLimit
        case itemDescription = "description"
        case categories
    }
}

// MARK: - BusinessLocation
struct BusinessLocation: Codable {
    let latitude, longitude: String
}

Decode

do {
    let res = try JSONDecoder().decode([Root].self, from: data)
    print(res)
}
catch {
    print(error)
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM