无法为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
相关产品推荐
相关产品推荐

