Переменные значения Swift не устанавливаются - PullRequest
0 голосов
/ 14 февраля 2019

Я добавляю немного синтаксического сахара в свое приложение, и я столкнулся с «несоответствием».Вероятно, для этого есть веская причина, но есть способ немного очистить реализацию.Я делаю это, чтобы предоставить единственное место для установки / получения некоторых свойств.

enum MyType: String {
    case Unknown, First, Second

    var enabled: Bool {
        set { UserDefaults.standard.set(newValue, forKey: self.rawValue) }
        get { return UserDefaults.standard.bool(forKey: self.rawValue) }
    }

}

Теперь я могу использовать значения enum для получения значений по умолчанию

if MyType.First.enabled {
    ........
}

Но я не могу установить напрямуюзначение:

MyType.First.enabled = true

elicits 'не может установить свойство, First не может быть назначено'

, но я могу сойти с рук

var type = MyType.First
type.enabled = true

Есть ли простой способиспользовать однострочный метод?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Проблема в том, что enum s являются типами значений, поэтому, когда вы вызываете установщик enabled для MyType.First, вы также изменяете First.Если вы не присваиваете типы значений явно изменяемой переменной, они считаются неизменяемыми.Вот почему if MyType.First.enabled {...} не работает, а

var type = MyType.First
type.enabled = true

работает.

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

enum MyType: String {
    case unknown, first, second

    var enabled: Bool {
        nonmutating set { UserDefaults.standard.set(newValue, forKey: self.rawValue) }
        get { return UserDefaults.standard.bool(forKey: self.rawValue) }
    }

}

PS: соглашение о присвоении имен Swift для enum случаев является lowerCamelCase, так как они сами не являются типами, и должны быть только типыUpperCamelCase.Я изменил ваш MyType enum соответственно.

0 голосов
/ 14 февраля 2019

Добавляя ключевое слово nonmutating к методу set, вы сообщаете компилятору, что метод set будет не изменять тип включения, то есть в данном случае enum MyType

enum MyType: String {
    case Unknown, First, Second

    var enabled: Bool {
       nonmutating set { UserDefaults.standard.set(newValue, forKey: self.rawValue) }
       get { return UserDefaults.standard.bool(forKey: self.rawValue) }
    }
}
...