Xcode 9.3中的Codable'没有初始化器'(Swift 4.1)

问题描述 投票:37回答:4

更新到Xcode 9.3(使用Swift 4.1)后,发现以下问题:

  1. 创建一个空项目,向其添加一个新的.swift文件并创建两个新类: Created to Codable classes class CodableOne: Codable { let some: String } class CodableTwo: Codable { var some: String } 建立成功
  2. CodableOne类型的CodableTwo添加一个新常量: Added a new constant to CodableOne class CodableOne: Codable { let some: String let another: CodableTwo } class CodableTwo: Codable { var some: String } 建立成功
  3. 现在将类CodableTwo移动到另一个文件(例如ViewController.swift) CodableTwo moved to another file 构建失败。

现在有一个错误,它不会消失。 Codable类不应该要求初始化器(如前面的步骤所示)。

关于这背后可能出现的问题及如何解决的任何想法将不胜感激!


附: Xcode 9.2中不存在问题。也不清理项目/构建路径,重新安装Xcode 9.3也有帮助。

swift xcode codable swift4.1 xcode9.3
4个回答
24
投票

作为mentioned in the comments,我必须做两件事:

  1. 在项目设置/构建设置中将编译模式更改为整个模块: Compilation Mode set to Whole Module
  2. 在项目设置/构建阶段/编译源下重新排序文件。具体来说,我将带有错误的文件带到了列表的前面。 Protip:如果您搜索文件的名称并且有多个结果,则将该文件拖到该较小列表中的顶部仍会将其带到前面。

21
投票

这是Swift 4.1编译器中的一个错误。要解决这个问题,可以执行the4kman答案中列出的步骤,或者只是在声明中将let更改为var,如下所示:

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.
}

解决方法courtesy of Apples Swift engineers

如果这个和4kmans的答案都没有帮助,你可以将另一个init添加到不能编译的模型中。如果您的类有大量变量,只需使init崩溃即可满足编译器的要求。 Codable初始化程序仍将被合成。

class C1: Decodable {
    let str: String

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

0
投票

我有这个问题,即使我的所有类都在同一个文件中,使用更深层次的结构似乎也可以工作


-3
投票

尝试给你的变量一个这样的初始值(将你的代码改为此)

class CodableOne: Codable{

    var some = ""

}

class CodableTwo: Codable{

    var some = ""

}
© www.soinside.com 2019 - 2024. All rights reserved.