Однако я пытаюсь согласовать класс с протоколом и получаю сообщение об ошибке. Вот код:
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
}
@Sweeper Строка находится в статической функции. Эта статическая функция возвращает контроллер представления типа UserSearchViewController. Я обновлю код.
Кроме того, вы, кажется, расширяете ChatUserSearchViewController
, но вы сказали, что хотите, чтобы UserSearchViewController
(без Chat
) соответствовал протоколу.
@Sweeper Только что обновил код
@juliand665 исправил! Это не проблема.
Вероятно, это было частью проблемы. В сочетании с ответом Sweeper это должно помочь.
Поскольку вы делаете это в статической функции, вы не можете использовать self
для ссылки на экземпляр вашего VC. Вместо этого у вас уже есть экземпляр вашего VC! Это vc
.
Просто установите vc
в качестве делегата вместо self
:
adapter.delegate = vc
Чтобы уточнить, нахождение в статическом контексте означает, что вы не находитесь в каком-либо конкретном экземпляре вашего класса (в этом случае вы только создаете такой экземпляр). Это означает, что self
относится к типUserSearchViewController
в целом, а не к его пример, но только экземпляры типов могут соответствовать протоколам.
@juliand665 juliand665 Если я хочу использовать экземпляр класса в другом месте класса, возможно ли это? Например я создаю переменную типа UserSearchViewController? внутри класса. Можно ли присвоить vc этой переменной?
да. Именно здесь вы бы использовали self
— в нестатическом контексте (т. е. всякий раз, когда в функции нет слова static
), self
относится к экземпляру, в котором вы сейчас находитесь, а не к самому типу.
Если вы все еще находитесь в статическом контексте, вы, конечно, можете получить к нему доступ, например vc.myVariable = vc
Где ты пишешь строчку
adapter.delegate = self
? Можете ли вы показать окружающий код? Сообщение об ошибке заставляет меня подозревать, что вы пишете эту строку в статическом контексте.