2015-07-11 3 views
4

С «Изучают основы Swift» детской площадки, есть пример протокол:только для чтения свойства протоколов Swift

protocol ExampleProtocol { 
    var simpleDescription: String { get } 
    func adjust() 
} 

Там есть небольшой отрывок после этого примера, который гласит:

Примечание: {get}, следующее за свойством simpleDescription, указывает, что он доступен только для чтения, что означает, что значение свойства можно просмотреть, но никогда не изменять.

Дополнительно приводится пример из класса, соответствующей этому протоколу:

class SimpleClass: ExampleProtocol { 
    var simpleDescription: String = "A very simple class." 
    var anotherProperty: Int = 69105 
    func adjust() { 
     simpleDescription += " Now 100% adjusted." 
    } 
} 

var a = SimpleClass() 
a.adjust() 
let aDescription = a.simpleDescription 

Однако как же этот класс соответствовать протоколу? Что мешает мне от мутации simpleDescription? Что я не понимаю?

Playground screenshot

ответ

9

Там нет способа указать в протоколе, что вы должны иметь Read- только недвижимость. В вашем протоколе запрашивается simpleDescription, а разрешает, но не требует сеттер.

Обратите внимание, что единственная причина, по которой вы можете мутировать simpleDescription, - это то, что вы знаете, что ваш a имеет тип SimpleClass. Если мы имеем переменную типа ExampleProtocol вместо ...

var a: ExampleProtocol = SimpleClass() 
a.simpleDescription = "newValue" //Not allowed! 
3

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

В этом примере для протокола требуется считываемое свойство simpleDescription и метод adjust(). Класс предусматривает, что он соответствует протоколу. Другими словами, этот протокол говорит, что реализация должна иметь операцию get, но она не запрещает им также иметь set.

Вы не сможете мутировать simpleDescription через этот интерфейс протокола, поскольку он не обеспечивает такую ​​операцию, но ничто не мешает вам мутирует через различного интерфейса - в этом примере, интерфейс реализующего класса.

0

Нашел и подумал, что может представлять интерес в дополнение к отличным ответ уже при условии:

Если протокол требует свойство быть GetTable и настраиваемой, это требование свойство не может быть выполнено с помощью константы сохраняются свойство или вычислимое свойство только для чтения. Если для протокола требуется только свойство, которое должно быть получено, это требование может быть удовлетворено любым свойством, и оно также может быть установлено, если это полезно для вашего собственного кода.

Выписка от: Apple Inc. "Язык быстрого программирования (Swift 2.2)." IBooks. https://itun.es/us/jEUH0.l

Смежные вопросы