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

无法为Requestable协议的parameters添加genres参数,URL不显示该参数

问题原因与解决方案

核心问题

你遇到的问题根源在Requestable协议扩展的parameters属性实现上:

  • 你把parameters定义成了计算属性,且setter是空实现(set { })。这意味着当你在GameListRequestModel的prepareRequest里执行self.parameters = [...]时,赋值操作完全不会保存数据——setter什么都没做。
  • 同时,parameters的getter固定返回只包含key的字典,所以后续生成URL时,只会拿到这个固定字典,自然看不到genres参数。

解决方案

1. 调整Requestable协议扩展

修改扩展中的parameters实现,去掉空setter,改为默认返回基础的key参数,允许结构体基于此扩展:

protocol Requestable {
    var baseURL: String? { get }
    var paths : [String]? { get }
    var parameters : [String : Any]? { get set }
    var headers : [String : String]? { get }
    var method : RequestMethod? { get }
    var body : [String : Any]? { get }
    
    func generateRequest() -> URLRequest?
    mutating func prepareRequest()
}

extension Requestable {
    var baseURL: String? {
        return ApiConstant.baseUrl.rawValue
    }
    var method: RequestMethod? {
        return .get
    }
    var body: [String : Any]? {
        return nil
    }
    // 默认返回基础key参数,允许结构体扩展
    var parameters: [String: Any]? {
        return ["key": "6b4fab3e88ec48aab19933b2c153c7c9"]
    }
    var headers: [String : String]? {
        return nil
    }
    
    mutating func prepareRequest() { }
}

2. 修改GameListRequestModel

让结构体自己声明parameters作为存储属性,并在prepareRequest中合并基础参数和自定义参数:

struct GameListRequestModel: Requestable {
    var paths: [String]?
    // 自己声明存储属性,遵循协议的get set要求
    var parameters: [String : Any]?
    
    private var genres: Int? = nil
    
    init(paths: [String], genres: Int? = nil) {
        self.paths = paths
        self.genres = genres
        prepareRequest()
    }
    
    mutating func prepareRequest() {
        // 先获取基础参数,再添加自定义的genres
        var mergedParams = self.parameters ?? [:]
        if let genres = genres {
            mergedParams["genres"] = String(genres)
        }
        self.parameters = mergedParams
        print("foo parameters: \(self.parameters)")
    }
}

效果说明

修改后,创建GameListRequestModel实例时,prepareRequest会自动把基础key和传入的genres合并到parameters存储属性中,后续生成URL时就能拿到包含两个参数的字典,URL里就会显示genres参数了。

内容的提问来源于stack exchange,提问作者Ufuk Köşker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:35:14