У меня есть такой фрагмент:
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 в структуре мутации, которая будет типом свойства Пользователь в сгенерированной вложенной структуре Fragments. Например:
mutation exchangePin($email: String!, $pin: String!) {
exchangePinForToken(email: $email, pin: $pin) {
valid
user {
...User
}
authToken
remainingAttempts
}
}
сгенерирует структуры ExchangePinMutation.Data.ExchangePinForToken.User и ExchangePinMutation.Data.ExchangePinForToken.User.Fragments. Однако свойство ПользовательExchangePinMutation.Data.ExchangePinForToken.User.Fragments относится к типу 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.
Я исправил свою проблему, переименовав фрагмент User в UserFull и создав псевдоним: typealias User = UserFull
Рефакторинг практически не требуется!
https://github.com/apollographql/apollo-codegen/issues/394#issuecomment-373323235