簡體   English   中英

為什么一個代碼可以正常工作,而另一個代碼卻無法獲得NSUserDefaults?

[英]Why will one code work but the other not with getting NSUserDefaults?

只想知道為什么從NSUserDefault檢索值時為什么一個代碼起作用而另一個代碼不起作用

這是我將信息保存到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起作用嗎? 謝謝

正常方法是第二種方法。 這就是你應該怎么做

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

保存

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

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

為了以安全的方式獲取值(如果未第一次設置,objectForKey可能返回nil)

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

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

您正在檢查對象是否存在(如?...),如果不存在,則使用屬性中的默認值(?? ...)

如您在Apple文檔中所見,您只能存儲:

默認對象必須是屬性列表,即NSData,NSString,NSNumber,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

    }

希望這個能對您有所幫助 !

stringForKey返回一個可選值,因此您可以使用nil合並運算符“ ??” 如果為零,則返回一個空字符串“”:

讓username1 = prefs.stringForKey(“ username”)??

我嘗試了您的代碼,它對我有用。 您可以在圖像中檢查此代碼:-

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

輸出圖像:-

輸出圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM