2016-05-26 2 views
0

просто хочу знать, почему один код работать, а другой не при извлечении значения из NSUserDefaultПочему один код работает, а другой не получает NSUserDefaults?

Вот как я сохранить данные в NSUserDefaults:

let prefs = NSUserDefaults.standardUserDefaults() 
prefs.setValue(user_names, forKey: "username") //storing the username "test" 

это, как я извлечь NSUserDefaults информация:

let prefs = NSUserDefaults.standardUserDefaults() //preference name 

let username1 = prefs.stringForKey("username") //doesn't work 
let username2: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("username") as? [NSString] //works 

print(username1) //doesn't work - "nil" 
print(username2) //works - "test" 

может кто-нибудь объяснить мне, почему username1 не работает, но username2 работает? благодаря

+1

тип данных USER_NAMES это? –

+0

@ Mr.UB "test" ... – johnjay22113

+1

@ johnjay22113 Итак, 'String'? Ваш код указывает, что это массив строк, т. Е. '[String]'.Вы пытаетесь получить как массив строк, так и одну строку из одного и того же ключа, поэтому вполне логично, что только один из них может работать - поскольку пользовательские значения по умолчанию могут содержать либо '[String]', либо 'String' для данный ключ, он не может содержать оба. – Hamish

ответ

2

Обычный способ - это второй способ. Это, как вы должны сделать это

let myString = "Test" 
var myStringArray = ["Test"] 

Чтобы сохранить

NSUserDefaults.standardUserDefaults().setObject(myString, forKey: "Key") 

NSUserDefaults.standardUserDefaults().setObject(myStringArray, forKey: "Key") 

Чтобы получить значение безопасным способом (objectForKey может возвращать ноль, если не установлен первый раз)

NSUserDefaults.standardUserDefaults().objectForKey("Key") as? String ?? myString 

NSUserDefaults.standardUserDefaults().objectForKey("Key") as? [String] ?? myStringArray 

You проверяют, существует ли объект (как? ...), и если вы не используете значения по умолчанию в своем свойстве (?? ...)

1

Как вы можете видеть в Apple documentation вы можете только магазин:

объект по умолчанию должен быть список свойств, то есть экземпляр (или коллекций сочетание экземпляров): NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Если вы хотите сохранить какой-либо объект типа , его обычно необходимо архивировать для создания экземпляра NSData .

Так что если вы хотите сохранить объект, которые имеют другой тип, вы должны сделать это:

let data = NSKeyedArchiver.archivedDataWithRootObject(yourObject) 
let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject(data, forKey:"yourObject") 

Затем, если вы хотите, чтобы восстановить его:

if let data = NSUserDefaults.standardUserDefaults().objectForKey("yourObject") as? NSData 
    { 
    let yourObject = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! YourObjectType 

    } 

Надеется, что это поможет !

+0

Я хочу хранить строку. Я делаю это правильно с кодом, который я использовал? – johnjay22113

+0

Я отправил ответ, который должен помочь вам – crashoverride777

0

stringForKey возвращает необязательный параметр, поэтому вы можете использовать оператор объединения nil «?» вернуть пустую строку "" в случае nil:

let username1 = prefs.stringForKey ("username") ?? ""

0

Я пробовал свой код и работает для меня. Вы можете проверить это в изображениях Код: -

let user_names = "test" 
    let prefs = NSUserDefaults.standardUserDefaults() 
    prefs.setValue(user_names, forKey: "username") 
    let username1 = prefs.stringForKey("username") 
    print(username1!) 

изображение, выводимое: -

OutPut Image

Смежные вопросы