1

我有以下片段:

fragment User on UserResponse {
    firstName
    lastName
    emailAddress
    emailConsent
    phoneNumber
}

当在突变中用作根时,代码生成将正确生成根User结构API.swift并将该结构用作用户属性的类型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.Fragments具有AddRelationsMutation.Data.AddRelation.Fragments相同的结构类型的用户User属性。

但是,当将片段嵌套User在突变中时,它会在 Mutation 结构中生成一个嵌套结构,这将是生成的嵌套结构中用户属性的类型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结构。但是,正如我所料, user的属性ExchangePinMutation.Data.ExchangePinForToken.User.Fragments是 typeExchangePinMutation.Data.ExchangePinForToken.User而不是 type 。User

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

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

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

4

1 回答 1

1

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

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

几乎不需要重构!

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

于 2018-03-15T10:28:01.633 回答