2014-10-01 3 views
-2

Я не люблю задавать простые вопросы, но сегодня я в тупике. Все, что мне нужно сделать, это посмотреть, есть ли значение, установленное в NSUserdefaults при запуске приложения. Если нет, то добавьте значение. Вот и все. Каждый раз, когда я запускаю мое приложение я получаю это как результатыSwift NSUserDefaults не получает набор

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    { 

     let defaults = NSUserDefaults.standardUserDefaults() 
     var returnValue: [String]? = NSUserDefaults.standardUserDefaults().objectForKey("BGColorStr") as? [String] 

     println("returnValue: \(returnValue) ...") 

     if (returnValue == nil) 
     { 
      println("Value is nil") 
      defaults.setObject("Default", forKey:"BGColorStr") 
      defaults.synchronize() 
     } 
     else 
     { 
      println("Value is NOT nil") 
     } 


     // Override point for customization after application launch. 
     return true 
    } 

returnValue: nil ... 
Value is nil 

ответ

10

При вызове setObject вы устанавливаете строку:

defaults.setObject("Default", forKey:"BGColorStr") 

При получении значения, вы пытаетесь бросить его в факультативный массив строк:

var returnValue: [String]? = NSUserDefaults.standardUserDefaults().objectForKey("BGColorStr") as? [String] 

Операционные системы as?returnValue - nil, потому что типы не совпадают.

Вы также используете var вместо let, когда вам это не нужно, и не используйте новый синтаксис Sw12 if let….

Попробуйте вместо этого: (последнее обновление для Swift 2/Xcode 7 Beta 3)

let defaults = NSUserDefaults.standardUserDefaults() 
let key = "BGColorStr" 

if let storedValue = defaults.objectForKey(key) as? String { 
    print("Value is NOT nil: \(storedValue)") 
} else { 
    print("Value is nil") 
    defaults.setObject("Default", forKey:key) 
    defaults.synchronize() 
} 

Если вы обнаружили, что делаете это много, вы можете инкапсулировать логику в NSUserDefaults расширения :

extension NSUserDefaults { 
    func objectForKey(defaultName: String, defaultValue: AnyObject) -> AnyObject { 
     var obj = objectForKey(defaultName) 

     if obj == nil { 
      obj = defaultValue 
      setObject(obj, forKey: defaultName) 
     } 

     return obj! 
    } 
} 

Затем прочитать значение:

let returnValue = NSUserDefaults 
    .standardUserDefaults() 
    .objectForKey("BGColorStr", defaultValue: "Default") 

// returnValue is either the stored value or "Default" 
+0

дерьмо, вы абсолютно правы –

+0

Еще один вопрос, когда я возвращаю значение, что означает слово «необязательный» и почему его часть выхода? returnValue: Необязательно («По умолчанию») –

+0

Это означает, что 'returnValue' может быть или не быть' nil'. 'if let storedValue = returnValue' помещает развернутое значение, если оно присутствует, в' storedValue'. –

1

кажется мне, что вы пытаетесь установить строку ("Default) в вашем NSUserDefaults, а затем получить массив строки ([String]).

Ваше возвращаемое значение будет иметь тип String, а не [String].

var returnValue = NSUserDefaults.standardUserDefaults().objectForKey("BGColorStr") as? String 
+0

': String?' Является излишним. –

+0

@AaronBrager Awh дерьмо, вы правы :) –

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