iOS 等效于 Android 共享首选项
Posted
技术标签:
【中文标题】iOS 等效于 Android 共享首选项【英文标题】:iOS Equivalent For Android Shared Preferences 【发布时间】:2013-10-12 23:01:34 【问题描述】:我正在将 android 应用程序移植到 ios,我使用的一件事是 Android 中的 Shared Preferences 以在每次完成关卡时保存。
这样,当用户重新进入应用时,他们可以看到自己达到了 3 级或其他级别。
iOS 中是否有类似的机制?还是我必须手动写入特定于应用程序的文件?
如果是这样,我如何写出仅对我的应用程序可见的文件?
谢谢。
【问题讨论】:
我猜在 iOS 中最接近这个的是NSUserDefaults。而here 是一个简单的例子,说明如何保存和检索。 【参考方案1】:使用 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
@chitti nope 那行不通,integerForKey 不返回可选【参考方案2】:
这是 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 documentation
synchronize()
等待对默认数据库的任何挂起的异步更新并返回;这种方法现在是不必要的,不应该使用。
【讨论】:
【参考方案3】: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")
【讨论】:
【参考方案4】:根据前面的回答,您已经知道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)
【讨论】:
以上是关于iOS 等效于 Android 共享首选项的主要内容,如果未能解决你的问题,请参考以下文章