В чем разница между вычисляемым свойством и свойством хранимой стоимости в Swift? - PullRequest
0 голосов
/ 29 августа 2018

Вопрос:

В чем разница между двумя строками в Row.swift ?

Контекст:

Row.swift

open class Row {

  // Existing code (Good):
  public var cellIdentifier: String { return String(describing self) }

  // The change (Bad):
  public var cellIdentifier: String = String(describing: self)

DifferentRow.swift

public class DifferentRow: Row {

  public override var cellIdentifier: String { return "\(super.cellIdentifier)" }
  // returns the error below

Ошибка:

Невозможно переопределить изменяемое свойство с помощью свойства только для чтения 'cellIdentifier'

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Вы не можете переопределить свойство «чтение и запись» со свойством, из которого можно только читать.

Вы можете назначить другое значение:

public override var cellIdentifier: String = “newValue”

или создайте реализацию set и get:

public override var cellIdentifier: String {
    get { return “\(super.cellIdentifier)” }
    set { super.cellIdentifier = newValue }
}

Под Computed Properties Подробнее об этом синтаксис .

0 голосов
/ 29 августа 2018

Я думаю, что сообщение об ошибке довольно запутанно.

Проблема с

public var cellIdentifier: String = String(describing: self)

является ссылкой на self:

  • При присвоении cellIdentifier во время определения, self не гарантируется для полной инициализации.
  • Следовательно, запрещено вызывать функцию (например, String(describing:)) и сдавать половину инициализированной self

Одним из решений может быть сделать cellIdentifier свойство ленивым:

public lazy var cellIdentifier: String = String(describing: self)

Это автоматически задержит вызов функции на время после завершения инициализации.

0 голосов
/ 29 августа 2018

Это:

public var cellIdentifier: String { return String(describing self) }

определяет вычисляемое свойство . Значение не сохраняется. Каждый раз, когда вы получаете доступ к cellIdentifier, закрытие запускается и возвращает String. Это только для чтения, потому что был предоставлен только получатель.

Это:

public var cellIdentifier: String = String(describing: self)

- это свойство хранимого значения , и оно доступно для чтения / записи.

Ошибка говорит вам, что вы не можете заменить свойство, имеющее возможности чтения / записи, на свойство, имеющее только возможности чтения.

Примечание: если вы инициализируете свойство значением, вы не можете получить доступ к self, потому что self не представляет экземпляр класса / структуры, пока объект не будет полностью инициализирован. Если вы сделали свойство lazy var, вы могли бы использовать self при инициализации, потому что тогда свойство будет инициализировано при первом обращении к нему.

Вы можете узнать больше о свойствах Swift здесь в Руководстве по языку Swift

...