Как вызвать функцию с именованным параметром

#swift

#swift

Вопрос:

     public func write<Query: GraphQLQuery>(data: Query.Data, forQuery query: Query) throws {
      try write(object: data, withKey: Query.rootCacheKey, variables: query.variables)
    }
  

Как мне вызвать эту функцию? Несколько попыток выдали мне ошибку компилятора: «неправильные метки аргументов при вызове (имеют ‘data:forQuery:’, ожидаемый ‘object:withKey:’)»

Я думаю, что это новое в параметрах swift.

Комментарии:

1. Эта функция определена для типа или это свободная функция? Пожалуйста, приведите примеры того, как вы пытались ее вызвать.

2. Я собираюсь предположить, что, поскольку она является универсальной, у компилятора возникают проблемы с определением типа. Убедитесь, что ваши параметры соответствуют сигнатуре метода, иначе вы получите загадочные ошибки, когда компилятор не сможет определить, как специализировать generic.

3. Пожалуйста, предоставьте реализацию для GraphQLQuery протокола

Ответ №1:

Это универсальная функция, для которой требуется, чтобы второй параметр ( query ) соответствовал GraphQLQuery протоколу, для которых требуется связанный тип Data .

Я не знаю, каковы требования этого протокола и как он реализован. Итак, давайте предположим, например:

 protocol GraphQLQuery {
    associatedtype Data
}
struct MyQuery: GraphQLQuery {
    typealias Data = Int
}
let query = MyQuery()
try? write(data: 0, forQuery: query)

or

do {
    try write(data: 0, forQuery: query)
} catch { ... error handling }
  

Итак, теперь для вызова функции нам нужно передать наш запрос и данные, с которыми этот запрос может работать ( Int в моем примере)

Ответ №2:

Мне кажется, что у вас есть аргумент в вашей функции, который не определен, «forQuery» не ищет никаких значений, которые должны быть переданы при вызове функции, это может быть вашей проблемой.

Примеры того, как вы пытаетесь вызвать функцию, было бы полезно добавить к этому вопросу, как указано в комментарии выше. Информация — отличный инструмент для любого разработчика, который хочет помочь ответить на ваш вопрос!

Убедитесь, что все ваши аргументы стремятся получить значение, переданное при вызове функции. Пример :

 public func write<Query: GraphQLQuery>(data: Query.Data, forQuery: pass in forQuery value here query: Query) throws {
      try write(object: data, withKey: Query.rootCacheKey, variables: query.variables)
    }