Swift 将我的类型转换为预期的参数类型
我使用Apollo客户端在Xcode中自动生成graphql类型和查询,但遇到了一个问题,我不知道如何最好地解决。TLDR是如何允许一个结构用作接受具有相同结构的另一类型的函数的参数 Apollo为我生成了一个名为“SizeInput”的结构,如下所示:Swift 将我的类型转换为预期的参数类型,swift,xcode,apollo,Swift,Xcode,Apollo,我使用Apollo客户端在Xcode中自动生成graphql类型和查询,但遇到了一个问题,我不知道如何最好地解决。TLDR是如何允许一个结构用作接受具有相同结构的另一类型的函数的参数 Apollo为我生成了一个名为“SizeInput”的结构,如下所示: struct SizeInput:graphqlmap{ 公共变量graphQLMap:graphQLMap 公共初始化(cm:Double){ graphQLMap=[“cm”:cm] } 公共变量cm:双{ 得到{ 返回graphQLMap
struct SizeInput:graphqlmap{
公共变量graphQLMap:graphQLMap
公共初始化(cm:Double){
graphQLMap=[“cm”:cm]
}
公共变量cm:双{
得到{
返回graphQLMap[“cm”]为!双精度
}
设置{
graphQLMap.updateValue(newValue,forKey:“cm”)
}
}
}
(顺便说一句,GraphQLMap
是[String:JSONEncodable?]
的类型别名)
我创建了一个Size
struct,用于代码中。我不想在我的代码中使用SizeInput
,将后端与我的应用程序代码分开,这样在后端或应用程序更改时不会出现问题
struct Size{
让cm:加倍
}
我需要运行一个apollo查询,该查询将SizeInput
作为一个参数,我希望通过从选择器填充的Size
变量填充该参数。虽然我知道我可以从Size
创建一个新的SizeInput
,但我希望将Size
传递到查询中,因为它们本质上是相同的,只是两种不同的类型。到目前为止,XCode显然抱怨无法将“Size”类型的值转换为预期的参数类型“SizeInput”
关键是我不能(不想)更改Apollo函数,因为它是自动生成的。因此,我的理想解决方案是以某种方式将Size
类型转换为SizeInput
,但如果我只是尝试执行let SizeInput=Size as,XCode会抱怨?大小输入
其中大小
是一个大小
假设我不能修改接受参数的函数,也不能修改
SizeInput
,因为两者都是自动生成的,如何修改大小
,使其可用作大小输入
参数?大小
和大小输入
根据您的帖子是两种不同的类型,因此不能按您的思维方式使用类型别名
关于typealias
,如下所述:
类型别名声明将现有类型的命名别名引入程序。[…]声明类型别名后,可以使用别名名称代替程序中任何地方的现有类型。[…]类型别名不会创建新类型;它们只允许名称引用现有类型
。。。但那不是你想要的Size
和SizeInput
在合同上相似,它们具有cm:Double
特性,但在发动机罩下结构不同,不能互换使用
您需要对您选择的任何解决方案进行一些权衡。我至少看到了以下选项
- 您可以编写一个位于codegen GraphQL内容之上的层,该层提供您想要的接口(即,采用
)并使用它。然后将大小
转换为大小
。可以使用Codegen大小输入
- 您可以在
类型本身上提供某种类型的Size
到Size
的类型级函数,然后在GraphQL调用站点上使用它。这里也可以使用CodegenSizeInput
- 您也可以在调用站点将
实例的Size
属性传递到cm
的构造函数中,这样就不会编写任何额外的代码。下面是一些伪代码:SizeInput
YMMV你能用一个函数扩展
struct Size
吗?这个函数返回你需要的SizeInput
类型,然后在需要SizeInput
的调用站点调用这个函数?如果这是最好的解决方案,我可以。我希望有一种干净的方法能够使用Size
作为Size输入。谢谢
extension Size {
func asSizeInput() -> SizeInput {
return SizeInput(cm: cm)
}
}
let size = Size(cm: 100)
let query = SizeInputGraphQLQuery(sizeInput: size.cm)