Swift readonly external, внутреннее свойство readwrite

В Swift используется обычный способ определения общей структуры, в которой свойство должно быть изначально доступно только для чтения, но модифицировано внутри classа (и подclassов), которые его владельцы.

В Objective-C есть следующие варианты:

  • Объявите свойство как readonly в интерфейсе и используйте расширение classа для доступа к свойству внутри. Это доступ к сообщениям, поэтому он отлично работает с KVO, атомарностью и т. Д.
  • Объявите свойство как только для чтения в интерфейсе, но внутренне поддерживайте поддержку ivar. Поскольку доступ по умолчанию для ivar защищен, это хорошо работает в иерархии classов, где подclassы также смогут изменять значение, но поле в противном случае является только для чтения.

В Java соглашение:

  • Объявите защищенное поле и реализуйте общеansible метод get-get-only-only.

Какая идиома для Свифта?

Учитывая свойство classа, вы можете указать другой уровень доступа, префикс объявления свойства с помощью модификатора доступа, а затем get или set между скобками. Например, свойство classа с публичным получателем и частным сеттером будет объявлено как:

 private(set) public var readonlyProperty: Int 

Предлагаемое чтение: Getters and Setters

Мартин считает, что уровень доступности остается в силе, т. Е. Не существует protected модификатора, который ограничивает доступ только к модулю, только для private файла, а public без ограничений.

Swift 3 примечания

К этому языку добавлены 2 новых модификатора доступа, fileprivate и open , в то время как private и public были слегка изменены:

  • open применяется только к classам и членам classа: он используется для того, чтобы class был подclassифицирован или член переопределялся вне модуля, где они определены. public вместо этого делает class или участника общедоступными, но не наследуемыми или переопределяемыми

  • private теперь делает элемент видимым и доступным только из fileprivate объявления, тогда как fileprivate для всего файла, где он содержится

Подробнее здесь .

В соответствии с @Antonio мы можем использовать одно свойство для доступа в качестве readOnly свойства readOnly публично и readWrite частном порядке. Ниже приведена моя иллюстрация:

 class MyClass { private(set) public var publicReadOnly: Int = 10 //as below, we can modify the value within same class which is private access func increment() { publicReadOnly += 1 } func decrement() { publicReadOnly -= 1 } } let object = MyClass() print("Initial valule: \(object.publicReadOnly)") //For below line we get the compile error saying : "Left side of mutating operator isn't mutable: 'publicReadOnly' setter is inaccessible" //object.publicReadOnly += 1 object.increment() print("After increment method call: \(object.publicReadOnly)") object.decrement() print("After decrement method call: \(object.publicReadOnly)") 

И вот вывод:

  Initial valule: 10 After increment method call: 11 After decrement method call: 10 
  • Как выполнить итерацию свойств анонимного объекта в C #?
  • Доступ к файлам свойств программно с помощью Spring?
  • Общаться между двумя windowsми в C #
  • В чем разница между инкапсулированием частного члена как свойства и определением свойства без частного члена?
  • Аутентифицированная среда равна нулю
  • Имущество (без дополнительной обработки) против публичного поля
  • Как реализовать виртуальные статические свойства?
  • C # настройка / получение свойств classа по имени строки
  • Как перебрать все свойства classа?
  • Как реализовать свойство только для чтения
  • Имеет ли C # свойства расширения?
  • Давайте будем гением компьютера.