iOS中与Android共享偏好设置相对应的功能是什么?

131
我正在将一个Android应用移植到iOS上,其中我使用了Android中的Shared Preferences来保存每次完成的关卡等级。
这样当用户重新进入应用时,他们可以看到他们已经完成了第3关或者其他关卡。
在iOS中是否有类似的机制?还是说我需要手动编写应用程序特定的文件?
如果有的话,如何编写只对我的应用程序可见的文件呢?
谢谢。

1
我猜在iOS中最接近这个的东西是NSUserDefaults这里有一个简单的保存和检索示例。 - Tarek Hallak
4个回答

230

使用 NSUserDefaults:- 注意,此方法适用于小型数据,例如像您提到的当前级别。不要滥用此方法并将其用作大型数据库,因为每次打开应用程序时都会加载到内存中,无论您是否需要其中的数据(应用程序的其他部分也会使用此数据)。

Objective-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)
}

.

Swift:

Reading:

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)
}

在Swift中,您还可以使用条件绑定来读取。例如: if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = savedLevel}`` - Raghu Teja
4
@chitti 不行,这样做不起作用。integerForKey 函数不会返回可选项。 - SomeGuy

53
这里是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()等待任何挂起的异步更新完成并返回;现在不再需要使用此方法。


7
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")

2

根据之前的答案,您已经知道UserDefaults是IOS中与共享首选项等价的。 您可以创建一个通用的写入函数,并基于数据类型创建读取函数。 然后从任何位置调用所需的方法。

ViewController.swift

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

Utils.swift

// 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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接