在我们的应用程序中,我们定义了一个枚举,它涵盖了应用程序可以命中的所有后端端点...
enum Route {
case todo(TodoRoute)
case event(EventRoute)
case userDetails
enum TodoRoute {
case create
case delete(Todo)
}
case EventRoute {
case list
case edit(Event)
}
}
这些被转换成各个端点和参数等等。
因此,我们在ApiClient上有几个函数,它们最终会进行网络调用...
public func request<A: Decodable>(
_ route: Route,
as: A.Type
) async throws -> A {
let (data, _) = try await self.request(route)
do {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
return try decoder.decode(A.self, from: data)
} catch {
throw error
}
}
public func request<A: Decodable>(
_ route: Route
) async throws -> A {
let (data, _) = try await self.request(route)
do {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
return try decoder.decode(A.self, from: data)
} catch {
throw error
}
}
正如您所看到的,它们将返回的数据解码为特定的泛型类型。
所以在通话地点看起来像是...
// 1.
let result = try await apiClient.request(.userDetails, as: UserDetails.self)
// 2.
let result: EventList = try await apiClient.request(.event(.list))
这些都可以工作,但我正在尝试找到一种方法,将解码的类型嵌入到函数调用本身中。
我们调用的每个端点只返回一种JSON类型,因此Route
示例和函数返回的类型之间存在1:1Map,因此不必在函数中显式定义路由和类型,应该可以只提供路由并推断类型。
let result = try await apiClient.request(.event(.list))
并从传入函数的Route
中推断出result
的类型。
也许这是不可能的?
我想在路径上加一个函数,比如route.resourceType
之类的,这样这个函数就可以从这个,推断出T是什么?
嗯......当我打字的时候,我在想这是不可能的?
有可能使这样的和类型的推理工作吗?
1条答案
按热度按时间oalqel3c1#
只是为了弄清楚这是回答。
正如@RobNapier所指出的,基于值来推断类型并不是Swift的一个特性,尽管它确实存在于其他语言中,但在Swift中并不是一个值得等待的特性。
https://en.wikipedia.org/wiki/Dependent_type