Swift 4:URLSession泛型解析中WebsiteDescription不兼容Encodable的问题
解决Type 'WebsiteDescription' does not conform to protocol 'Encodable'错误
我来帮你搞定这个Swift编码的问题,这个报错其实是编译器的自动合成规则在搞怪,咱们一步步来解决:
核心原因
你只是给WebsiteDescription类加了Encodable协议,但没满足编译器自动生成编码逻辑的条件。Swift对于类类型来说,不会自动为单独声明Encodable的类(哪怕已经遵循Decodable)生成encode(to:)方法,尤其是当你没有用Codable这个组合别名的时候。
解决方案1:改用Codable(最推荐)
Codable是Decodable & Encodable的类型别名,只要你的类的所有存储属性都遵循Codable,编译器会自动帮你生成解码和编码的全部代码,完全不用手动写实现。把你的类声明改成这样就行:
import UIKit public class WebsiteDescription: Codable { // 这里放你的存储属性,比如: // let siteName: String // let courseList: [Course] // ... }
记得也要让Course类遵循Codable哦,不然数组类型的属性编码会出问题。
解决方案2:手动实现Encodable方法
如果你一定要分开声明Decodable和Encodable,那得自己写encode(to:)方法,告诉编译器怎么把类的属性编码成数据:
import UIKit public class WebsiteDescription: Decodable, Encodable { // 你的存储属性示例 let siteName: String let courseList: [Course] // 手动实现Encodable要求的方法 public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(siteName, forKey: .siteName) try container.encode(courseList, forKey: .courseList) // 有其他属性就继续加对应的encode语句 } // 必须声明CodingKeys来对应属性和JSON的键 enum CodingKeys: String, CodingKey { case siteName, courseList } }
这个方法需要你手动映射每个属性到编码容器里,适合需要自定义编码逻辑的场景。
额外注意点
- 不管用哪种方案,你的
Course类也必须遵循Encodable(或者Codable),不然WebsiteDescription里的Course类型属性没法被编码。 - 如果你的
WebsiteDescription类有父类,那父类也得遵循Codable,否则编译器没法自动合成编码逻辑。
内容的提问来源于stack exchange,提问作者JESERRANO
相关产品推荐
相关产品推荐

