Почему мне разрешено устанавливать свойство протокола только для чтения, используя структуру, которая наследует указанный протокол? - PullRequest
0 голосов
/ 20 мая 2018

Я следую учебному пособию по парадигме ориентированного на протокол программирования, в котором я смущен чем-то, что, на мой взгляд, было довольно простым: свойства только для чтения протоколов или методов получения и установки.Насколько я понимаю, свойство «только для чтения» обозначается с помощью ключевого слова «get» при объявлении переменной в протоколе.Я был взволнован, поэтому я быстро запрограммировал созданную игровую площадку, чтобы увидеть, было ли мое мышление точным, однако кажется, что я все еще могу изменить свойство, которое, по моему мнению, было доступно только для чтения.Что я делаю не так, чтобы сделать его действительно доступным только для чтения, где я не могу его установить?

protocol FullName {
    var firstName: String {get set}
    var lastName: String {get set}
    var readOnlyProperty: String {get}

}

struct OuttaBeerOuttaHere: FullName {
    var firstName: String

    var lastName: String

    var readOnlyProperty: String = "Jack! Jack!...Line from Titanic"

}

var leonardoDicaprio = OuttaBeerOuttaHere.init(firstName: "Leonardo", lastName: "Dicaprio", readOnlyProperty: "WTF")

print(leonardoDicaprio.readOnlyProperty) //prints "WTF"

leonardoDicaprio.readOnlyProperty = "what now"

print(leonardoDicaprio.readOnlyProperty) //prints "what now"

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

Ваш протокол не объявляет readOnlyProperty как свойство только для чтения.Требуется только, чтобы реализации этого протокола имели как минимум свойство gettable readOnlyProperty.Разрешить мутации этого свойства или нет, зависит от самой реализации.

0 голосов
/ 20 мая 2018

Что я делаю неправильно, чтобы сделать его истинным свойством только для чтения, где я не могу его установить?

Существует разница между протоколом (набором правил)и тип (т. е. ваша структура), который принимает протокол.

  • Ваше правило протокола гласит, что readOnlyProperty должно быть доступно для чтения.

  • Ваша структура подчиняется чтению, а также делает ее доступной для записи.Это не противозаконно, так что все хорошо - и readOnlyProperty в вашей структуре для чтения-записи.

То, что было бы было бы недопустимым, было бы обратным,т. е. для протокола, чтобы объявить свойство для чтения-записи, но для того, чтобы объявить его только для чтения.Та ситуация не возникла в вашем примере, но если бы она возникла, компилятор остановил бы вас.

0 голосов
/ 20 мая 2018

Из Документы

Вот пример протокола с требованием к одному экземпляру свойства:

protocol FullyNamed {
    var fullName: String { get }
}

Для протокола FullyNamed требуется тип соответствияпредоставить полное имя.Протокол не указывает ничего другого о природе соответствующего типа - он только указывает, что тип должен быть в состоянии предоставить полное имя для себя.Протокол гласит, что любой тип FullyNamed должен иметь свойство экземпляра gettable с именем fullName, которое имеет тип String

Это требование протокола, а не определение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...