iOS эквивалент для общих настроек Android
Я портирую Android-приложение на iOS, одну вещь, которую я использовал, это Shared Preferences в Android для сохранения при каждом завершении уровня.
Таким образом, когда пользователь возвращается в приложение, он может видеть, что он до уровня 3 или чего-то еще.
Есть ли подобный механизм в iOS? или я должен вручную записать в файл приложения?
Если да, то как мне записать файлы, видимые только моему приложению?
Благодарю.
Ответы
Ответ 1
Используйте 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:
Чтение:
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)
}
Ответ 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
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)
}
}