You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:10:10