swift - Apollo iOS 代码生成 : Nested use of a fragment in a mutation creates unexpected property types in Fragments struct

标签 swift code-generation apollo apollo-ios

我有以下片段:

fragment User on UserResponse {
    firstName
    lastName
    emailAddress
    emailConsent
    phoneNumber
}

当在突变中用作根时,代码生成将在 API.swift 中正确生成根 User 结构并将该结构用作 的类型Fragments

中的用户 属性

例如:

mutation updateUserYourInformation($phoneNumber: String!, $emailConsent: Boolean!) {
    updateUser(phoneNumber: $phoneNumber, emailConsent: $emailConsent) {
        ...User
    }
}

mutation addRelations($spouse: Boolean!, $children: Int!, $roomMates: Int!) {
     addRelations(spouse: $spouse, roommates: $roomMates, children: $children) {
        ...User
    }
}

将生成突变,其中 UpdateUserYourInformationMutation.Data.UpdateUser.FragmentsAddRelationsMutation.Data.AddRelation.Fragments 都具有 user 属性相同的结构类型 User

但是,当将片段嵌套在突变中时,它会在突变结构中生成嵌套的 User 结构,这将是生成的嵌套中的 user 属性的类型Fragments 结构。例如:

mutation exchangePin($email: String!, $pin: String!) {
    exchangePinForToken(email: $email, pin: $pin) {
        valid
        user {
            ...User
        }
        authToken
        remainingAttempts
    }
}

将生成 ExchangePinMutation.Data.ExchangePinForToken.UserExchangePinMutation.Data.ExchangePinForToken.User.Fragments 结构。但是,ExchangePinMutation.Data.ExchangePinForToken.User.Fragmentsuser 属性属于 ExchangePinMutation.Data.ExchangePinForToken.User 类型,而不是类型User,如我所料。

因此,类型不同,为了更新我应用中的当前 User 对象,我必须拍摄 ExchangePinMutation.Data.ExchangePinForToken.User 的快照,并且使用它初始化一个新的 User 对象:例如:

...
let userSnapshot = data.exchangePinForToken.user?.snapshot
Session.currentUser = User(snapshot: userSnapshot)
...

也许我只是错误地创建了我的片段和/或突变?

最佳答案

问题是 ExchangePinMutation.Data.ExchangePinForToken.User.Fragments 结构的用户属性应该是用户片段类型,但该类型被本地 ExchangePinMutation.Data.ExchangePinForToken 隐藏.用户类型。

我通过将 User 片段重命名为 UserFull 并创建类型别名解决了我的问题:typealias User = UserFull

几乎不需要重构!

https://github.com/apollographql/apollo-codegen/issues/394#issuecomment-373323235

关于swift - Apollo iOS 代码生成 : Nested use of a fragment in a mutation creates unexpected property types in Fragments struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49296528/

相关文章:

ios - 崩溃不会出现在 crashlytics 上

swift - 如何将 : Cannot convert value of type: GameData - Codeable, 修复为预期参数数据

java - 使用 JCodeModel 生成 java 字节码

c# - 在运行时(构建时)创建 T4 模板?

typescript - 如何使用 jest 测试 Apollo Server 订阅?

Meteor/React/ApolloServer/BodyParser - 有效负载太大

reactjs - 如何仅在用户身份验证后设置 Apollo 客户端?

ios - 指定字体时,NSString.boundingRect 失败并显示 "[NSNull renderingMode]: unrecognized selector sent to instance"

swift firebase 获取关注者 uid,然后获取他们的详细信息

java - Web层文件的模板机制