protocol A : class { ... }
определяет «протокол только для класса» : Только этот тип классов (а не структуры или перечисления) может принимать этот протокол.
Слабые ссылки определены только для ссылочные типы . Классы являются ссылочными типами, структурами и перечислениями являются типы значений. (Закрытия также являются ссылочными типами, но замыкания не могут принимать протокол, поэтому в этом контексте они неактуальны.) Поэтому, если ваш протокол определяет слабое свойство, тогда протокол должен быть протоколом только для классов.
Вот еще один пример, который требует только для протокола:
protocol A { var name : String { get set } } func foo(a : A) { a.name = "bar" // error: cannot assign to property: 'a' is a 'let' constant }
Это не скомпилируется, потому что для экземпляров структур и перечислений
a.name = "bar"
является мутациейa
. Если вы определяете протокол какprotocol A : class { var name : String { get set } }
, то компилятор знает, что
a
является экземпляром типа класса, к которомуa
является ссылкой на хранилище объектов, аa.name = "bar"
изменяет ссылающийся на объект, но неa
.Как правило, вы должны определить протокол только для классов, если вам нужны типы, принимающие протокол как ссылочные типы, а не типы значений.