Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将我的类型转换为预期的参数类型_Swift_Xcode_Apollo - Fatal编程技术网

Swift 将我的类型转换为预期的参数类型

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

我使用Apollo客户端在Xcode中自动生成graphql类型和查询,但遇到了一个问题,我不知道如何最好地解决。TLDR是如何允许一个结构用作接受具有相同结构的另一类型的函数的参数

Apollo为我生成了一个名为“SizeInput”的结构,如下所示:

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
    SizeInput
    的类型级函数,然后在GraphQL调用站点上使用它。这里也可以使用Codegen
  • 您也可以在调用站点将
    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)