【发布时间】:2021-05-14 13:01:43
【问题描述】:
我正在使用 Apollo Client 在 Xcode 中自动生成 graphql 类型和查询,但遇到了一个我不知道如何最好地解决的问题。 TLDR 是如何允许将一个结构用作接受具有相同结构的另一种类型的函数的参数?
Apollo 为我生成了一个名为“SizeInput”的结构,如下所示:
struct SizeInput: GraphQLMapConvertible {
public var graphQLMap: GraphQLMap
public init(cm: Double) {
graphQLMap = ["cm": cm]
}
public var cm: Double {
get {
return graphQLMap["cm"] as! Double
}
set {
graphQLMap.updateValue(newValue, forKey: "cm")
}
}
}
(顺便说一句 - GraphQLMap 是 [String : JSONEncodable?] 的类型别名)
我创建了一个 Size 结构用于我的代码。我不想在我的代码中使用SizeInput 将后端与我的应用代码分开,这样如果后端或应用发生变化,事情就不会中断。
struct Size {
let cm: Double
}
我需要运行一个以 SizeInput 作为参数的 apollo 查询,我想从选择器填充的 Size 变量中填充该参数。虽然我知道我可以从Size 创建一个新的SizeInput,但我很想将Size 传递到查询中,因为它们本质上是相同的,只是两种不同的类型。截至目前,XCode 明显在抱怨Cannot convert value of type 'Size' to expected argument type 'SizeInput'
关键是我不能(不想)更改 Apollo 函数,因为它是自动生成的。所以我理想的解决方案是以某种方式将Size 类型转换为SizeInput,但是如果我只是尝试执行let sizeInput = size as? SizeInput,其中size 是Size,XCode 就会抱怨。
假设我不能修改接受参数的函数并且我不能修改 SizeInput 因为两者都是自动生成的,我该如何修改 Size 以便它可以用作 SizeInput 参数?
【问题讨论】:
-
您能否扩展
struct Size使用返回您需要的SizeInput类型的函数,然后在需要SizeInput的调用点调用该函数? -
如果这最终成为最佳解决方案,我可以。我希望有一种干净的方式能够将
Size用作SizeInput。