设置为共享实例

时间:2016-06-10 10:23:49

标签: swift

我试图这样做,所以每当应用程序移动到后台或被杀或者其他什么时,都会保存我的设置 我想访问并设置属性" useLimits"我的应用程序。

为什么不起作用?

有没有更优雅的方法来实现这一目标?

import UIKit

class Settings: NSObject
{

    static let sharedInstance = Settings()

    private let kUseLimits = "kUseLimits"

    var useLimits = false

    override init()
    {
        super.init()
        NSNotificationCenter.defaultCenter().addObserver(
            self,
            selector: #selector(Settings.save),
            name: UIApplicationWillResignActiveNotification,
            object: nil)
        let userdefaults = NSUserDefaults.standardUserDefaults()
        self.useLimits = userdefaults.boolForKey(kUseLimits)

    }

    deinit
    {
        NSNotificationCenter.defaultCenter().removeObserver(self)
        save()
    }

    func save()
    {
        let userdefaults = NSUserDefaults.standardUserDefaults()
        userdefaults.setBool(self.useLimits, forKey: kUseLimits)
        userdefaults.synchronize()
    }

    func reset()
    {
        self.useLimits = false
        save()
    }

}

1 个答案:

答案 0 :(得分:3)

我认为这样的事情会很好:

class AppSettings {
  private struct Keys {
    static let useLimits = "AppSttings.useLimits"
  }

  static var useLimits: Bool {
    set {
      NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: Keys.useLimits)
    }
    get {
      return NSUserDefaults.standardUserDefaults().boolForKey(Keys.useLimits)
    }
  }

  static func rest() {
    useLimits = false
  }
}

P.S。从iOS 8开始,您无需在NSUserDefault中调用synchronize()

P.S.S。如果没有此类对象,NSUserDefaults.standardUserDefaults().boolForKey(Keys.useLimits)将返回false,如果您需要特定的默认值,请检查对象或使用NSUserDefaults.standardUserDefaults().registerDefaults()

P.S.S.S。它不会影响你的性能,所以你可以从UD读取并在运行中写入,但如果你想要性能代码太多,你可以这样做:

private static var _useLimits: Bool?
static var useLimits: Bool {
  set {
    NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: Keys.useLimits)
    _useLimits = newValue
  }
  get {
    if _useLimits == nil {
      _useLimits = NSUserDefaults.standardUserDefaults().boolForKey(Keys.useLimits)
    }
    return _useLimits!
  }
}

或更优雅的当前价值:

private static var _useLimits: Bool = NSUserDefaults.standardUserDefaults().boolForKey(Keys.useLimits)
static var useLimits: Bool {
  set {
    NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: Keys.useLimits)
    _useLimits = newValue
  }
  get {
    return _useLimits
  }
}