Apollo iOS codegen: вложенное использование фрагмента в мутации создает неожиданные типы свойств в структуре Fragments
У меня есть следующий фрагмент:
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.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)
...
Может быть, я просто создаю свои фрагменты или мутации неправильно?
1 ответ
Проблема в том, что пользовательское свойство ExchangePinMutation.Data.ExchangePinForToken.User.Fragments
struct должна иметь тип фрагмента User, но этот тип затеняется локальным типом ExchangePinMutation.Data.ExchangePinForToken.User.
Я исправил проблему, переименовав User
фрагмент к UserFull
и создание typealias: typealias User = UserFull
Рефакторинг практически не нужен!