在我的应用程序中,几个控制器具有非常相似的代码结构。差异很小。因此,为了优化,我决定为这些控制器创建一个基础,并从基础继承每个特定的控制器。
我有一个发送网络请求和处理响应的函数。我将响应结构作为参数传递给该函数,以便该函数向我返回一个现成的响应结构。每个这样的结构是Decodable
。
这种结构的一个例子:
struct APIAnswerUserActivity: Decodable {
let status: String
let code: Int?
let data: [UserActivity]?
let total: Int?
}
字符串
网络请求的函数,Decodable.Protocol
类型的对象(结构)被接受为jsonType
参数:
public func networkRequest<T: Decodable> (
url: String,
timeout: Double = 30,
method: URLMethods = .GET,
data: [String : String]? = nil,
files: [URL]? = nil,
jsonType: T.Type,
success: @escaping (T) -> Void,
failure: @escaping (APIError) -> Void
) -> URLSessionDataTask { ... }
型
在主控制器中有几个参数,我通过覆盖子控制器中的参数来覆盖它们。其中一个参数应该是Decodable
类型的对象,以便常规函数正确接收数据。响应的JSON结构非常相似,但仍略有不同。由于数据仍然有一点不同,因此无法为它们创建通用结构。
如果在主控制器中执行以下操作:
public var decodableType: Decodable.Type {
return APIAnswerUserActivity.self
}
型
这将工作,并且可以重新定义类型,但网络函数不接受这一点。它需要Decodable.Protocol
对象。如果为变量decodableType
指定了类型decodable.Protocol
,则不再可能添加APIAnswerUserActivity.self
,当调用networkRequest函数时,将悄悄接受APIAnswerUserActivity.self
。
在这种情况下该怎么办?我希望我能够正确而清晰地阐述我的问题的本质。
1条答案
按热度按时间0dxa2lsx1#
@Вл адисл ав Артемье в,我仍然不确定我是否完全理解了这个问题,因为你还没有分享接受
Decodable
类的代码。但是问题似乎是关于如何传递Decodable
类。我希望下面的内容可以帮助你澄清如何在泛型上施加正确的约束,以及如何声明变量。你可以把它贴到操场上做实验。
字符串