37 votes

Codable «n'a pas d'initialiseurs» dans Xcode 9.3 (Swift 4.1)

Après la mise à jour de Xcode 9.3 (qui utilise Swift 4.1), le problème suivant a été trouvé:

  1. Créer un projet vide, ajouter un nouveau .swift fichier et de créer deux nouvelles classes:

    Created to Codable classes

    class CodableOne: Codable {
    
        let some: String
    
    }
    
    class CodableTwo: Codable {
    
        var some: String
    
    }
    

    Génération réussit

  2. Ajouter une nouvelle constante d' CodableOne de type CodableTwo:

    Added a new constant to CodableOne

    class CodableOne: Codable {
    
        let some: String
        let another: CodableTwo
    
    }
    
    class CodableTwo: Codable {
    
        var some: String
    
    }
    

    Génération réussit

  3. Maintenant, déplacez la classe CodableTwo à un autre fichier (fichier ViewController.swift, par exemple)

    CodableTwo moved to another file

    L'échec de la construction.

Maintenant, il y a une erreur, ce qui ne va pas loin. Codable classes ne devraient pas exiger des initialiseurs (comme illustré dans les étapes précédentes).

Toutes les idées sur ce que pourrait être le problème et comment il pourrait être réglée sera très apprécié!


P. S. Problème n'est pas présent dans Xcode 9.2. Ni pour le nettoyage de la project/build path, ni re-installation de Xcode 9.3 aide.

24voto

Tamás Sengel Points 25414

Comme mentionné dans les commentaires, j'ai eu à faire deux choses:

  1. changement de Mode de Compilation de Tout le Module à l'intérieur du Projet de paramètres/Paramètres de construction:

    Compilation Mode set to Whole Module

  2. réorganisation des fichiers dans les paramètres de Projet/Construire/Phases de la Compilation des Sources. Plus précisément, j'ai apporté les fichiers qui ont une erreur sur le devant de la liste.

    Protip: si vous effectuez une recherche pour le nom de fichier et il n'y a plus d'un résultat, en faisant glisser le fichier vers le haut dans cette petite liste va encore amener sur le devant.

21voto

Oscar Apeland Points 2891

C'est un bug dans l' Swift 4.1 compilateur. Pour contourner cela, effectuez les étapes décrites dans the4kman de réponse, ou tout simplement de changer de let de var dans votre déclaration, en tant que tel:

class C1 : Decodable { 
  let str: String 
  // error: Class 'C1' has no initializers - if class C's `c1` is a let constant. 
}

class C : Decodable {
  var c1: C1 // << Change to `var`, compilation succeeds.
}

Solution de contournement courtoisie de Pommes Swift ingénieurs.

Si ni le présent, ni the4kmans réponse aide, vous pouvez ajouter un autre init pour les modèles qui ne compile pas. Si vos classes ont des tonnes de variables, juste le plantage de l' init de satisy le compilateur. L' Codable initialiseur va encore être synthétisés.

class C1: Decodable {
    let str: String

    @available(*, deprecated, message: "Do not use.")
    private init() {
        fatalError("Swift 4.1") 
    }
}

0voto

Hogdotmac Points 149

j'ai eu ce problème même si toutes mes classes étaient dans le même fichier, l'utilisation de structures pour les plus profondes semble fonctionner

-3voto

Sanad Barjawi Points 170

essayez de donner à votre variable une valeur initiale comme celle-ci (changez votre code en ceci)

 class CodableOne: Codable{

    var some = ""

}

class CodableTwo: Codable{

    var some = ""

}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X