更新到Xcode 9.3(使用Swift 4.1)后,发现以下问题:
class CodableOne: Codable {
let some: String
}
class CodableTwo: Codable {
var some: String
}
建立成功CodableOne
类型的CodableTwo
添加一个新常量:
class CodableOne: Codable {
let some: String
let another: CodableTwo
}
class CodableTwo: Codable {
var some: String
}
建立成功CodableTwo
移动到另一个文件(例如ViewController.swift)
构建失败。现在有一个错误,它不会消失。 Codable
类不应该要求初始化器(如前面的步骤所示)。
关于这背后可能出现的问题及如何解决的任何想法将不胜感激!
附: Xcode 9.2中不存在问题。也不清理项目/构建路径,重新安装Xcode 9.3也有帮助。
作为mentioned in the comments,我必须做两件事:
这是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")
}
}
我有这个问题,即使我的所有类都在同一个文件中,使用更深层次的结构似乎也可以工作
尝试给你的变量一个这样的初始值(将你的代码改为此)
class CodableOne: Codable{
var some = ""
}
class CodableTwo: Codable{
var some = ""
}