Ваш протокол SampleProtocol
может быть принят class
или struct
. Swift использует поведение типа значения, который является более ограничительным типом, пока вы не скажете ему, что протокол будет использоваться только ссылочным типом class
.
Добавьте соответствие AnyObject
в ваш протокол для получить поведение ссылочного типа:
protocol SampleProtocol: AnyObject {
var message: String? { get set }
}
Подробнее см. Руководство по программированию Swift 5.1 - Протоколы только для класса .
Примечания к руководству:
Используйте протокол только для класса, когда поведение, определенное требованиями этого протокола, предполагает или требует, чтобы соответствующий тип имел ссылочную семантику, а не семантику значения.
Историческая справка : Использование class
ключевого слова :
До Swift 4.0 это было написано с использованием ключевого слова class
:
protocol SampleProtocol: class {
var message: String? { get set }
}
Пока что это работает, но в настоящее время это просто псевдоним типа для AnyObject
и, вероятно, будет удален в более поздней версии Swift.