相当于iOS的Android共享首选项


105

我正在将一个Android应用程序移植到iOS,我使用的一件事是Android中的“共享的偏好设置”,以在每次关卡完成时进行保存。

这样,当用户重新进入应用程序时,他们可以看到自己已达到3级或其他级别。

iOS中有类似的机制吗?还是我必须手动写出到特定于应用程序的文件?

如果是这样,我如何写出仅对应用程序可见的文件?

谢谢。


1
我猜最接近iOS的是NSUserDefaults。而这里是如何保存和检索一个简单的例子。
塔雷克·哈拉克

Answers:


203

使用NSUserDefaults:- 请注意,这是针对少量数据的,例如您提到的当前级别。不要滥用它并将其用作大型数据库,因为无论您是否需要从应用程序中每次访问,它都会加载到内存中(应用程序的其他部分也将使用此功能)。

目标C:

读:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  Doesn't exist.
}
else
{
    //  Get current level
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

写作:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

const NSInteger currentLevel = ...;
[preferences setInteger:currentLevel forKey:currentLevelKey];

//  Save to disk
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Couldn't save (I've never seen this happen in real world testing)
}

迅速:

读:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

写作:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

let currentLevel = ...
preferences.setInteger(currentLevel, forKey: currentLevelKey)

//  Save to disk
let didSave = preferences.synchronize()

if !didSave {
    //  Couldn't save (I've never seen this happen in real world testing)
}

您还可以使用条件绑定快速读取if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = savedLevel}
Raghu Teja

4
@chitti nope无法正常工作,integerForKey不返回可选值
SomeGuy 2015年

40

这是Swift 3的更新

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

写作

let preferences = UserDefaults.standard

let currentLevel = ...
let currentLevelKey = "currentLevel"
preferences.set(currentLevel, forKey: currentLevelKey)

更新资料

UserDefaults文档中

synchronize()等待对默认数据库的任何未决异步更新并返回;此方法现在是不必要的,不应使用。


2
class Configuration {

    static func value<T>(defaultValue: T, forKey key: String) -> T{

        let preferences = UserDefaults.standard
        return preferences.object(forKey: key) == nil ? defaultValue : preferences.object(forKey: key) as! T
    }

    static func value(value: Any, forKey key: String){

        UserDefaults.standard.set(value, forKey: key)
    }

}

//set
Configuration.value(value: "my_value", forKey: "key_1")

//get
let myValue = Configuration.value(defaultValue: "default_value", forKey: "key_1")

-1

按照前面的答案,您已经知道这UserDefaults等效于ios中的共享首选项。您可以基于数据类型创建通用的写入功能和读取创建功能。并从任何地方调用所需的方法。

ViewController.swift

 // write data
 writeAnyData(key: "MY_KEY", value: "MyData")
 // read string data 
 readStringData(key: "MY_KEY"), animated: true)

实用程序

// read and write user default
let userDefault = UserDefaults.standard
// write
func writeAnyData(key: String, value: Any){
    userDefault.set(value, forKey: key)
    userDefault.synchronize()
}

// read int values
func readIntData(key: String) -> Int{
    if userDefault.object(forKey: key) == nil {
        return 0
    } else {
        return userDefault.integer(forKey: key)
    }
}

// read string values
func readStringData(key: String) -> String{
    if userDefault.object(forKey: key) == nil {
        return ""
    } else {
        return userDefault.string(forKey: key)!
    }
}
// read bool value
func readBoolData(key: String) -> Bool{
    if userDefault.object(forKey: key) == nil {
        return false
    } else {
        return userDefault.bool(forKey: key)
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.