关于ios:Swift-如何为NSUserDefaults设置初始值

Swift - How to set initial value for NSUserDefaults

我有一个名为soundSwitch的开关,我正在使用用户默认值来保存按钮的状态,例如:

1
2
3
4
5
6
7
8
9
@IBAction func soundsChanged(sender: AnyObject) {
        if soundSwitch.on{
            defaults.setBool(true, forKey:"SoundActive")
            print("Sound ON")
        }else{
            defaults.setBool(false, forKey:"SoundActive")
            print("Sound OFF")
        }
    }

当前,当用户首次启动应用程序时,实际的默认值最初为false。

如果用户首次启动该应用并且尚未对其进行配置,那么如何实现默认值true。

我在Objective-C中看到过方法,但是在Swift中什么都没看到。从我所看到的,您可以在应用程序委托中以某种方式或在plist文件中进行操作。我该怎么做?


Swift 3语法示例

注册一个布尔默认值:

1
UserDefaults.standard.register(defaults: ["SoundActive" : true])

并获取值:

1
UserDefaults.standard.bool(forKey:"SoundActive")

旁注:尽管上面的代码将返回true,但是请注意,只有在设置好该值后,该值才真正写入磁盘:

1
UserDefaults.standard.set(true, forKey:"SoundActive")


通过AppDelegate将其添加到您的didFinishLaunchingWithOptions方法中。正如其他一些人指出的那样,请将所有内容都放入此方法中,以免滥用。

1
2
3
4
5
6
7
8
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    /// Here you can give default values to your UserDefault keys
    UserDefaults.standard.register(defaults: [
       "SoundActive": true,
       "someOtherKey":"Some Message"
        ])
}


雨燕4

我更喜欢实现类似于UserDefaults.string(forKey: )的函数,如果未设置该值,则该函数将返回nil。结合??运算符,除非您稍后明确设置它们,否则无需将任何默认值写入磁盘。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extension UserDefaults {

    public func optionalInt(forKey defaultName: String) -> Int? {
        let defaults = self
        if let value = defaults.value(forKey: defaultName) {
            return value as? Int
        }
        return nil
    }

    public func optionalBool(forKey defaultName: String) -> Bool? {
        let defaults = self
        if let value = defaults.value(forKey: defaultName) {
            return value as? Bool
        }
        return nil
    }
}

然后您可以按以下方式检索默认值

1
2
3
4
let defaults = UserDefaults.standard
let userName = defaults.string(forKey:"Username") ??"Happy"
let userAge = defaults.optionalInt(forKey:"Age") ?? 21
let isSmart = defaults.optionalBool(forKey:"Smart") ?? true

使用" registerDefaults"可以设置NSUserDefaults的默认值

1
2
3
4
5
let userDefaultsDefaults = [
           "SoundActive" : true
        ]

NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults)

注意:将其写在didFinishLaunchingWithOptions中,以便设置默认值。

在要检查的地方的下面的代码中写

1
2
3
4
5
6
 let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool!

 if (onoroff != nil && onoroff == false)
 {
    self.checkForAgreement()
 }

没有特定的快捷方式或应用程序委托。

通过在standardUserDefaults实例上调用registerDefaults:来设置初始默认值。

您可以多次调用此程序,建议您不要在应用程序委托中进行此调用,而应在适当的时间在应用程序中注册适当的详细信息,因此,如果您有1个使用某些特定控件的视图控制器/子系统默认值,然后将默认值注册为初始化的一部分(如果该代码)。

仅当您的代码被多个不同部分使用时,才应考虑在应用程序委托中执行此操作,并且仅当您没有其他合适的控制器可以使用它时。


您可以将所有UserDefaults逻辑封装到一个属性变量中,该属性变量会自动注册应用程序默认值,并将所有更新保存回用户默认值字典中。如果应用程序的其他部分(除了开关控件)也读取或更改此状态,则这特别方便。

Swift 5-第一部分执行一个闭包以初始化属性,第二部分是didSet块,该属性在每次更改属性时都会自动调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
var soundIsActive: Bool = {
        // Register the app default:
        UserDefaults.standard.register(defaults: ["SoundActive" : true])

        // Initialize the property with the current user default:
        return UserDefaults.standard.bool(forKey:"SoundActive")
    }()
    {
        didSet {
            // Update user default when the variable is set:
            UserDefaults.standard.set(soundIsActive, forKey:"SoundActive")
        }
    }

1
2
3
4
5
6
7
8
9
10
func lastStatus() -> Bool {
    let defaultValue = true
    if let value = default.valueForKey("SoundActive") {
        // then use it
        return value as? Bool ?? defaultValue
    } else {
        // oh, no value?
        return defaultValue
    }
}

我认为这是使用它的最佳方法。 register(defaults:)也会有帮助,但是Apple在文档中建议将其用作fallback,例如将no valuedefault value的情况分开。取决于您的需要。


如何设置默认值的通用版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
enum UserDefaultsKeys: String {
    case username ="kUsername"
}

extension UserDefaults {
    func optionalValue< T >(forKey key: UserDefaultsKeys) -> T? {
        if let value = self.value(forKey: key.rawValue) {
            return value as? T
        }
        return nil
    }
}

let username = defaults.optionalValue(forKey: .username) ??""

如果您真的想这样做,请将其放在AppDelegate中:

1
2
3
4
5
6
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let defaults = NSUserDefaults.standardUserDefaults()
    if defaults.valueForKey("SoundActive") == nil {
        defaults.setBool(true, forKey:"SoundActive")
    }

如果仅在一个viewcontroller中使用它,请考虑将代码放在viewDidLoad方法中!


将其放在AppDelegate的" didFinishLaunchingWithOptions"中。

1
2
3
4
5
6
7
8
if defaults.valueForKey("launchedAlready") == true {
       print("Not first launch.")
    }
    else {
       defaults.setValue(true, forKey:"launchedAlready")
        defaults.setBool(true, forKey:"SoundActive")
        print("Sound ON")
    }