Протокол не соответствует классу, унаследованному от общего родительского класса?

Однако я пытаюсь согласовать класс с протоколом и получаю сообщение об ошибке. Вот код:

class UserSearchViewController: GenericSearchViewController<User> 

Я пытаюсь привести его в соответствие с buttontappeddelegate:

extension UserSearchViewController: ButtonDidGetTappedDelegate {
func button(wasTappedInCell cell: UserCollectionViewCell) {
    print("Cell Tapped")
   }
}

Я получаю сообщение об ошибке, когда назначаю себя делегату:

adapter.delegate = self 

Cannot assign value of type 'UserSearchViewController.Type' to type 'ButtonDidGetTappedDelegate?'

В чем проблема? Любая помощь будет оценена по достоинству.

class UserSearchViewController: GenericSearchViewController<User> {
    static func searchV (Config: ConfigurationProtocol,
                     dataSource: DataSource,
                     viewer: User) ->  UserSearchViewController
  let vc = UserSearchViewController(Config, dataSource,viewer) 
   ......
   ...
  adapter.delegate = self
  return vc

}

Где ты пишешь строчку adapter.delegate = self? Можете ли вы показать окружающий код? Сообщение об ошибке заставляет меня подозревать, что вы пишете эту строку в статическом контексте.

Sweeper 30.05.2019 22:29

@Sweeper Строка находится в статической функции. Эта статическая функция возвращает контроллер представления типа UserSearchViewController. Я обновлю код.

Osama Naeem 30.05.2019 22:32

Кроме того, вы, кажется, расширяете ChatUserSearchViewController, но вы сказали, что хотите, чтобы UserSearchViewController (без Chat) соответствовал протоколу.

juliand665 30.05.2019 22:34

@Sweeper Только что обновил код

Osama Naeem 30.05.2019 22:36

@juliand665 исправил! Это не проблема.

Osama Naeem 30.05.2019 22:37

Вероятно, это было частью проблемы. В сочетании с ответом Sweeper это должно помочь.

juliand665 30.05.2019 22:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы делаете это в статической функции, вы не можете использовать self для ссылки на экземпляр вашего VC. Вместо этого у вас уже есть экземпляр вашего VC! Это vc.

Просто установите vc в качестве делегата вместо self:

adapter.delegate = vc

Чтобы уточнить, нахождение в статическом контексте означает, что вы не находитесь в каком-либо конкретном экземпляре вашего класса (в этом случае вы только создаете такой экземпляр). Это означает, что self относится к типUserSearchViewController в целом, а не к его пример, но только экземпляры типов могут соответствовать протоколам.

juliand665 30.05.2019 22:42

@juliand665 juliand665 Если я хочу использовать экземпляр класса в другом месте класса, возможно ли это? Например я создаю переменную типа UserSearchViewController? внутри класса. Можно ли присвоить vc этой переменной?

Osama Naeem 30.05.2019 22:51

да. Именно здесь вы бы использовали self — в нестатическом контексте (т. е. всякий раз, когда в функции нет слова static), self относится к экземпляру, в котором вы сейчас находитесь, а не к самому типу.

juliand665 30.05.2019 22:52

Если вы все еще находитесь в статическом контексте, вы, конечно, можете получить к нему доступ, например vc.myVariable = vc

juliand665 30.05.2019 22:53

Другие вопросы по теме