Переменная уровня класса установлена ​​всегда ноль, почему? - PullRequest
0 голосов
/ 23 ноября 2018

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

Ниже вывод моей консоли:

// test = nil// Demo.test = nil

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        Demo.test = "app"
        print("Demo.test = \(Demo.test)")
    }
}

class Demo {

    class var test: String? {
        set {
            UserDefaults.standard.set(test, forKey: "test")
            print("test = \(test)")
        }
        get {
            return UserDefaults.standard.string(forKey: "test")
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Код использует test для доступа к значению, переданному в установщик.Использование test осуществляет доступ к получателю, который возвращает nil.

Чтобы использовать значение, предоставленное установщику, используйте переменную, сгенерированную компилятором newValue.

class Demo {
    class var test: String? {
        set {
            print("test = \(newValue)")
            UserDefaults.standard.set(newValue, forKey: "test")
        }
        get {
            return UserDefaults.standard.string(forKey: "test")
        }
    }
}

В качестве альтернативы вы можете объявитьиспользуемое имя переменной.

class Demo {
    class var test: String? {
        set(newTestValue) {
            print("test = \(newTestValue)")
            UserDefaults.standard.set(newTestValue, forKey: "test")
        }
        get {
            return UserDefaults.standard.string(forKey: "test")
        }
    }
}

Для первого примера см. Вычисляемые свойства, Сокращенное объявление сеттера .Для второго см. Вычисленные свойства .

https://docs.swift.org/swift-book/LanguageGuide/Properties.html

0 голосов
/ 23 ноября 2018

Когда вы вызываете test внутри setter , getter вызывается для получения значения test.На данный момент значение «test» равно nil внутри UserDefaults.Поэтому вместо сохранения test вам следует использовать newValue, то есть значение, которое вы собираетесь установить для переменной.

class Demo {

    class var test: String? {
        set {
            UserDefaults.standard.set(newValue, forKey: "test")
            print("test = \(test)")
        }
        get {
            return UserDefaults.standard.string(forKey: "test")
        }
    }

}

Из документов

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

Проверьте раздел ComputedProperties в Свойства чтобы понять, как работают геттеры и сеттеры.

...