在没有显式初始化程序的情况下创建结构时
public struct Preference {
public let id: String
}
它internal init(id: String)免费获得初始化程序。内部意味着从另一个目标使用它会导致编译器错误。
添加Decodable到您的结构还会public init(from: Decoder)向该结构添加初始化程序。
所以初始结构等价于以下
public struct Preference: Codable {
public let id: String
internal init(id: String) {
self.id = id
}
public init(from: Decoder) {
// generated decoding code
}
}
当您尝试使用Preference(id: "cool")另一个目标创建实例时,只有一个公共初始化程序:带有解码器的初始化程序。编译器尝试通过强制转换来使用它,String但Decoder它失败了。
要解决原始问题,您需要public init(id: String)显式添加初始化程序。