private (set) со свойствами let - модификатор 'private (set)' нельзя применить к свойствам только для чтения - PullRequest
0 голосов
/ 28 февраля 2020

Я уже знаю, как работает private(set). Но приведенный ниже код дает ошибку времени компиляции,

class Person {
    private(set) let name: String //Error.
    private(set) let age: Int //Error.

    init(name: String, age: Int){
        self.name = name
        self.age = age
    }
}

Ошибка:

модификатор «private (set)» не может быть применен к чтению только свойства

Поскольку name и age не являются свойствами только для чтения, такая ошибка не должна выдаваться.

Если я использую let вместо var, работает нормально. Просто пытаюсь узнать почему?

Ответы [ 5 ]

1 голос
/ 28 февраля 2020

private(set) let противоречие в терминах. Любому установщику требуется var iable.

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

В Swift есть только один случай для использования private(set): если класс содержит код, который изменяет переменную

class Foo {
    let name : String
    private(set) var expiryDate : Date

    init(name: String, expiryDate: Date){
        self.name = name
        self.expiryDate = expiryDate
    }

    func extendExpiryDate(to newDate : Date) {
       expiryDate = newDate
    }
}

Если свойство инициализируется только во время init, это константа - как правильно указано в других ответах - поэтому объявите ее как let константа. В отличие от других языков программирования Swift предоставляет явные константы с преимуществами большей безопасности, меньшего использования памяти и лучшей производительности.

1 голос
/ 28 февраля 2020

Пусть являются константами ... вы не можете изменить их значение, которое вы им присвоили. Вот почему они считаются readOnly ... поэтому ошибка действительна ... либо преобразуйте их в var, если вы хотите установить их после присвоения им какого-либо значения, либо удалите private (set) и сделайте их просто приватными

happy кодирование =)

0 голосов
/ 28 февраля 2020

Из Swift.org в разделе «Получатели и установщики»

Вы можете предоставить установщику более низкий уровень доступа, чем его соответствующий получатель, чтобы ограничить область чтения-записи этого переменная, свойство или индекс . Вы назначаете более низкий уровень доступа, записывая fileprivate (set), private (set) или внутренний (set) перед var или вводным индексом .

Похожие записи: Swift: Что означает эта ошибка: модификатор «private (set)» нельзя применить к свойствам только для чтения?

0 голосов
/ 28 февраля 2020

Вам не нужен частный установщик, если он является let константой. Просто инициализируйте его в конструкторе или в той же строке, что и объявление.

Если вы хотите изменить его вне конструктора, вам нужно сделать его var

0 голосов
/ 28 февраля 2020

Они доступны только для чтения, потому что вы объявили их с let, а не var.

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