37

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

  1. 创建一个空项目,向其中添加一个新的 .swift 文件并创建两个新类:

    创建到 Codable 类

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

    构建成功

  2. 添加一个新的常量CodableOne类型CodableTwo

    向 CodableOne 添加了一个新常量

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

    构建成功

  3. 现在将类移动CodableTwo到另一个文件(例如 ViewController.swift)

    CodableTwo 移动到另一个文件

    构建失败

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

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


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

4

4 回答 4

24

正如评论中提到的,我必须做两件事:

  1. 项目设置/构建设置中将编译模式更改为整个模块

    编译模式设置为整个模块

  2. 重新排序Project settings/Build Phases/Compile Sources下的文件。具体来说,我将有错误的文件放在列表的前面

    提示:如果您搜索文件名并且有多个结果,将文件拖到该较小列表的顶部仍会将其置于最前面。

于 2018-04-04T13:43:38.367 回答
21

这是Swift 4.1编译器中的一个错误。要解决此问题,请执行 the4kman 的答案中概述的步骤,或者只需在您的声明中更改letvar,如下所示:

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

Apples Swift 工程师提供的解决方法。

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

class C1: Decodable {
    let str: String

    @available(*, deprecated, message: "Do not use.")
    private init() {
        fatalError("Swift 4.1") 
    }
}
于 2018-04-09T06:21:04.237 回答
0

即使我所有的类都在同一个文件中,我也遇到了这个问题,但使用结构更深的类似乎可行

于 2018-05-07T13:07:22.200 回答
-3

尝试为您的变量提供这样的初始值(将您的代码更改为此)

class CodableOne: Codable{

    var some = ""

}

class CodableTwo: Codable{

    var some = ""

}
于 2018-04-10T10:13:14.133 回答