Как я могу использовать UserDefaults для сохранения/извлечения строк, булевых и других данных в Swift?
Как я могу использовать UserDefaults в Swift?
Ответ 1
ref: NSUserdefault objectTypes
Swift 3 и выше
магазин
UserDefaults.standard.set(true, forKey: "Key") //Bool
UserDefaults.standard.set(1, forKey: "Key") //Integer
UserDefaults.standard.set("TEST", forKey: "Key") //setObject
Получить
UserDefaults.standard.bool(forKey: "Key")
UserDefaults.standard.integer(forKey: "Key")
UserDefaults.standard.string(forKey: "Key")
Удалить
UserDefaults.standard.removeObject(forKey: "Key")
Удалить все ключи
if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
Swift 2 и ниже
магазин
NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")
NSUserDefaults.standardUserDefaults().synchronize()
Получить
var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]
Удалить
NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")
Регистрация
registerDefaults: добавляет registrationDictionary к последнему элементу в каждом списке поиска. Это означает, что после того, как NSUserDefaults будет искать значение во всех других допустимых местоположениях, оно будет искать зарегистрированные значения по умолчанию, делая их полезными в качестве "запасного" значения. Зарегистрированные значения по умолчанию никогда не сохраняются между запусками приложения и видны только приложению, которое их регистрирует.
Значения по умолчанию из файлов конфигурации по умолчанию будут автоматически зарегистрированы.
например, определить приложение при запуске, создать структуру для сохранения при запуске
struct DetectLaunch {
static let keyforLaunch = "validateFirstlunch"
static var isFirst: Bool {
get {
return UserDefaults.standard.bool(forKey: keyforLaunch)
}
set {
UserDefaults.standard.set(newValue, forKey: keyforLaunch)
}
}
}
Зарегистрируйте значения по умолчанию при запуске приложения:
UserDefaults.standard.register(defaults: [
DetectLaunch.isFirst: true
])
удалить значение при завершении приложения:
func applicationWillTerminate(_ application: UIApplication) {
DetectLaunch.isFirst = false
}
и проверьте состояние как
if DetectLaunch.isFirst {
// app launched from first
}
Имя пакета UserDefaults
еще одно свойство имя набора, в основном оно используется для концепции групп приложений, пример сценария, который я взял из здесь :
Сценарий использования состоит в том, что я хочу отделить свои UserDefaults (различные бизнес-логики могут потребовать, чтобы UserDefault были сгруппированы отдельно) по идентификатору, такому как Android SharedPreferences. Например, когда пользователь в моем приложении нажимает кнопку выхода из системы, я хотел бы очистить настройки по умолчанию для его учетной записи, но не местоположение устройства.
let user = UserDefaults(suiteName:"User")
использование userDefaults синхронизирует, подробная информация добавлена в дубликате ответа.
Ответ 2
Лучший способ использовать UserDefaults
меры
- Создать расширение UserDefaults
- Создайте перечисление с необходимыми ключами для хранения в локальном
- Храните и извлекайте локальные данные в любом месте
Образец
extension UserDefaults{
//MARK: Check Login
func setLoggedIn(value: Bool) {
set(value, forKey: UserDefaultsKeys.isLoggedIn.rawValue)
//synchronize()
}
func isLoggedIn()-> Bool {
return bool(forKey: UserDefaultsKeys.isLoggedIn.rawValue)
}
//MARK: Save User Data
func setUserID(value: Int){
set(value, forKey: UserDefaultsKeys.userID.rawValue)
//synchronize()
}
//MARK: Retrieve User Data
func getUserID() -> Int{
return integer(forKey: UserDefaultsKeys.userID.rawValue)
}
}
enum для ключей, используемых для хранения данных
enum UserDefaultsKeys : String {
case isLoggedIn
case userID
}
Сохранить в UserDefaults, где вы хотите
UserDefaults.standard.setLoggedIn(value: true) // String
UserDefaults.standard.setUserID(value: result.User.id!) // String
Получить данные в любом месте приложения
print("ID : \(UserDefaults.standard.getUserID())")
UserDefaults.standard.getUserID()
Удалить значения
UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.userID)
Таким образом, вы можете хранить примитивные данные в лучшем
Обновление Вам не нужно использовать synchronize() для хранения значений. Как @Moritz указал на то, что это не нужно, и учитывая статью об этом. Проверьте комментарии для более подробной информации
Ответ 3
Swift 4:
хранить
UserDefaults.standard.set(object/value, forKey: "key_name")
Retrive
var returnValue: [datatype]? = UserDefaults.standard.object(forKey: "key_name") as? [datatype]
Удалить
UserDefaults.standard.removeObject(forKey:"key_name")
Ответ 4
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")
//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
Ответ 5
Вы можете использовать NSUserDefaults
в swift таким образом,
@IBAction func writeButton(sender: UIButton)
{
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("defaultvalue", forKey: "userNameKey")
}
@IBAction func readButton(sender: UIButton)
{
let defaults = NSUserDefaults.standardUserDefaults()
let name = defaults.stringForKey("userNameKey")
println(name) //Prints defaultvalue in console
}
Ответ 6
Я нормально сохранил NSDictionary и смог правильно его получить.
dictForaddress = placemark.addressDictionary! as NSDictionary
let userDefaults = UserDefaults.standard
userDefaults.set(dictForaddress, forKey:Constants.kAddressOfUser)
//Для получения данных из NSDictionary.
let userDefaults = UserDefaults.standard
let dictAddress = userDefaults.object(forKey: Constants.kAddressOfUser) as! NSDictionary
Ответ 7
Swift 5 и выше:
let defaults = UserDefaults.standard
defaults.set(25, forKey: "Age")
let savedInteger = defaults.integer(forKey: "Age")
defaults.set(true, forKey: "UseFaceID")
let savedBoolean = defaults.bool(forKey: "UseFaceID")
defaults.set(CGFloat.pi, forKey: "Pi")
defaults.set("Your Name", forKey: "Name")
defaults.set(Date(), forKey: "LastRun")
let array = ["Hello", "World"]
defaults.set(array, forKey: "SavedArray")
let savedArray = defaults.object(forKey: "SavedArray") as? [String] ?? [String()
let dict = ["Name": "Your", "Country": "YourCountry"]
defaults.set(dict, forKey: "SavedDict")
let savedDictionary = defaults.object(forKey: "SavedDictionary") as? [String: String] ?? [String: String]()
:)
Ответ 8
В классе A
задайте значение для ключа:
let text = "hai"
UserDefaults.standard.setValue(text, forKey: "textValue")
В классе B
получите значение для текста, используя ключ, объявленный в классе A
и назначьте его соответствующей переменной, которая вам нужна:
var valueOfText = UserDefaults.value(forKey: "textValue")
Ответ 9
class UserDefaults_WorstPresidentName {
static let key = "appname.worstPresidentName"
static var value: String? {
get {
return UserDefaults.standard.string(forKey: key)
}
set {
if newValue != nil {
UserDefaults.standard.set(newValue, forKey: key)
} else {
UserDefaults.standard.removeObject(forKey: key)
}
}
}
}
Ответ 10
Я бы сказал, что Анбу отвечает отлично, но мне нужно было добавить охрану при получении настроек, чтобы моя программа не перестала работать.
Вот обновленный фрагмент кода в Swift 5
Хранение данных в настройках
@IBAction func savePreferenceData(_ sender: Any) {
print("Storing data..")
UserDefaults.standard.set("RDC", forKey: "UserName") //String
UserDefaults.standard.set("TestPass", forKey: "Passowrd") //String
UserDefaults.standard.set(21, forKey: "Age") //Integer
}
Извлечение данных из настроек
@IBAction func fetchPreferenceData(_ sender: Any) {
print("Fetching data..")
//added guard
guard let uName = UserDefaults.standard.string(forKey: "UserName") else { return }
print("User Name is :"+uName)
print(UserDefaults.standard.integer(forKey: "Age"))
}
Ответ 11
Swift 4, я использовал Enum для обработки UserDefaults.
Это всего лишь пример кода. Вы можете настроить его в соответствии с вашими требованиями.
Для сохранения, извлечения, удаления. Таким образом просто добавьте ключ для ключа UserDefaults в перечисление. Учитывайте значения при получении и хранении в соответствии с типом данных и вашими требованиями.
enum UserDefaultsConstant : String {
case AuthToken, FcmToken
static let defaults = UserDefaults.standard
//Store
func setValue(value : Any) {
switch self {
case .AuthToken,.FcmToken:
if let _ = value as? String {
UserDefaults.standard.set(value, forKey: self.rawValue)
}
break
}
UserDefaults.standard.synchronize()
}
//Retrieve
func getValue() -> Any? {
switch self {
case .AuthToken:
if(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) != nil) {
return "Bearer "+(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) as! String)
}
else {
return ""
}
case .FcmToken:
if(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) != nil) {
print(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue))
return (UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) as! String)
}
else {
return ""
}
}
}
//Remove
func removeValue() {
UserDefaults.standard.removeObject(forKey: self.rawValue)
UserDefaults.standard.synchronize()
}
}
Для хранения значения в userdefaults,
if let authToken = resp.data?.token {
UserDefaultsConstant.AuthToken.setValue(value: authToken)
}
Для получения значения из userdefaults,
//As AuthToken value is a string
(UserDefaultsConstant.AuthToken.getValue() as! String)