swift 从函数的输入之一推断该函数的返回类型

ogsagwnx  于 2023-01-29  发布在  Swift
关注(0)|答案(1)|浏览(97)

在我们的应用程序中,我们定义了一个枚举,它涵盖了应用程序可以命中的所有后端端点...

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是什么?
嗯......当我打字的时候,我在想这是不可能的?
有可能使这样的和类型的推理工作吗?

oalqel3c

oalqel3c1#

只是为了弄清楚这是回答。
正如@RobNapier所指出的,基于值来推断类型并不是Swift的一个特性,尽管它确实存在于其他语言中,但在Swift中并不是一个值得等待的特性。
https://en.wikipedia.org/wiki/Dependent_type

相关问题