web-dev-qa-db-fra.com

iOS Swift Decodable: Erreur: Impossible d'appeler l'initialiseur pour le type sans arguments

Je reçois une erreur lors de l'initialisation d'une structure, veuillez voir la capture d'écran ci-dessous. Après le débogage, j'ai trouvé que l'inclusion d'une variable de révision dans la structure pose problème. Je ne peux pas comprendre ce que je fais mal. Quelqu'un peut m'aider?

Tx

Je copie du code au cas où vous auriez besoin de l'essayer

import UIKit

struct RootValue : Decodable {
    private enum CodingKeys : String, CodingKey {
        case success = "success"
        case content = "data"
        case errors = "errors"
    }
    let success: Bool
    let content : [ProfileValue]
    let errors: [String]
}

struct ProfileValue : Decodable {
    private enum CodingKeys : String, CodingKey {
        case id = "id"
        case name = "name"
        case review = "review" // including this gives error
    }

    var id: Int = 0
    var name: String = ""
    var review: ReviewValues // including this gives error
}

struct ReviewValues : Decodable{
    private enum CodingKeys : String, CodingKey {
        case place = "place"
    }

    var place: String = ""
}

class ViewController: UIViewController {

    var profileValue = ProfileValue()

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

enter image description here

6
Matt

La révision n'a pas de valeur par défaut, vous devez la modifier

var profileValue = ProfileValue()

à

var profileValue:ProfileValue?

OU

var review: ReviewValues?

OU

supply init méthode dans ProfileValue struct

8
Sh_Khan

Votre structure ProfileValue n'a pas de valeur par défaut pour la propriété review. C'est pourquoi le compilateur n'est pas satisfait, car vous essayez de créer une instance de ProfileValue sans fournir de valeurs par défaut pour toutes les propriétés non facultatives.

En remarque, toutes vos valeurs d'énumération de clé de codage correspondent simplement aux noms de propriété. Vous n'avez pas besoin d'inclure l'énumération des clés de codage si les noms sont identiques.

3
MultiColourPixel

Ajoutez une init à votre structure ProfileValue:

struct ProfileValue : Decodable {
  private enum CodingKeys : String, CodingKey {
    case id = "id"
    case name = "name"
    case review = "review" // including this gives error
  }

  var id: Int = 0
  var name: String = ""
  var review: ReviewValues // including this gives error

  init() {
    self.review = ReviewValues()
  }
}
0
Christian Abella

Ajoutez la méthode init par défaut pour fournir la méthode init par défaut en modal codable pour créer l'objet codé.

struct Modal: Codable {

    var status: String?
    var result : [Result?]?

    // To provide the default init method to create the encoded object

    init?() {
        return nil
    }

    private enum CodingKeys: String, CodingKey {
        case status = "status"
        case result = "result"
    }
}
0
Nirbhay Singh