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

EBD*_*KUM 37 xcode swift codable swift4.1 xcode9.3

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

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

    创建为Codable类

    class CodableOne: Codable {
    
        let some: String
    
    }
    
    class CodableTwo: Codable {
    
        var some: String
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

    建立成功

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

    为CodableOne添加了一个新常量

    class CodableOne: Codable {
    
        let some: String
        let another: CodableTwo
    
    }
    
    class CodableTwo: Codable {
    
        var some: String
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

    建立成功

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

    CodableTwo移动到另一个文件

    构建失败.

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

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


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

Tam*_*gel 24

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

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

    编译模式设置为整个模块

  2. 项目设置/构建阶段/编译源下重新排序文件.具体来说,我将带有错误的文件带到了列表的前面.

    Protip:如果您搜索文件的名称并且有多个结果,则将该文件拖到该较小列表中的顶部仍会将其带到前面.


Osc*_*and 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.
}
Run Code Online (Sandbox Code Playgroud)

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

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

class C1: Decodable {
    let str: String

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