protocol
- это требование некоторого минимального интерфейса типа, его реализующего.
var name: Type { get }
требует, чтобы у типа было свойство по крайней мере с getter
(доступно извне типа, но не private
), т.е. внешний код должен иметь возможность прочитайте стоимость имущества. В типе реализации это могут быть let name: Type
, var name: Type
, private(set) var name: Type
, fileprivate(set) var name: Type
и т. Д.
var name: Type { get set }
требует, чтобы тип имел свойство с обоими доступными getter
и setter
, т.е. внешний код должен иметь возможность читать и записывать к собственности. Здесь разрешается только var name: Type
.
Если protocol
требуется для getter
, но вы также предоставляете setter
- это не противоречит protocol
требованиям.
Но если для protocol
требуется и для getter
, и для setter
- вы должны предоставить оба, и отсутствие любого из них не будет действительной реализацией.
Ваш Person
класс определил оба свойства как var
(с доступными getter
и setter
), поэтому вы можете изменить их оба. Но PersonProtocol
не требуется способность устанавливать firstName
.
И, как показывает @JoakimDanielson, если вы будете использовать только интерфейс, необходимый для protocol
, вам не придется изменять значение firstName
.