我有一些代碼來獲得一個串出userDefaults的:展開和鑄造的最簡潔的方式可選
if let userString = (userDefaults.objectForKey("user")) {
userTextField.stringValue = userString as! String
}
首先,我必須看到,如果選購的是不是nil
。然後我必須將它從AnyObject
中轉換爲一個字符串。
有沒有更好的方法來做到這一點?也許是一個班輪?
我有一些代碼來獲得一個串出userDefaults的:展開和鑄造的最簡潔的方式可選
if let userString = (userDefaults.objectForKey("user")) {
userTextField.stringValue = userString as! String
}
首先,我必須看到,如果選購的是不是nil
。然後我必須將它從AnyObject
中轉換爲一個字符串。
有沒有更好的方法來做到這一點?也許是一個班輪?
請注意,如果存在密鑰「user」的默認值,則強制轉換as! String
會崩潰,但 不是字符串。一般情況下,你可以結合可選的結合(if let
)與可選投(as?
):
if let userString = userDefaults.objectForKey("user") as? String {
// ... default value for key exists and is a string ...
userTextField.stringValue = userString
}
但實際上NSUserDefaults
具有用於該目的的專用方法:
if let userString = userDefaults.stringForKey("user") {
// ... default value for key exists and is a string ...
userTextField.stringValue = userString
}
如果你要分配默認字符串爲 默認不存在或不是字符串,則使用 無合併運算符??
,如 Swift issue with nil found while unwrapping an Optional value NSDefautlts,例如:
userTextField.stringValue = userDefaults.stringForKey("user") ?? "(Unknown)"
,我喜歡很多清理它的另一種方式是做每個檢查 第一,並退出如有不符合。這允許容易理解條件將使該函數退出的條件。
雨燕這也可以用來避免使用武力展開崩潰是一個非常有趣的guard
聲明:
guard let userString = userDefaults.objectForKey("user") as? String else {
// userString var will accessible outside the guard scope
return
}
userTextField.stringValue = userString
使用您及早檢查損壞的情況下衛士,讓您 功能更具可讀性並更容易維護。如果條件不符合 ,則會運行guard's else語句,該語句脫離該函數。 如果條件通過,則此處的可選變量將自動在您調用的警戒語句爲 的範圍內展開爲您打開 。
對於特殊情況NSUserDefaults
最好的和推薦的方法是始終使用非可選值。
首先儘快在AppDelegate
中註冊鍵/值對,但至少在使用之前。
let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["user" : ""]
defaults.registerDefaults(defaultValues)
好處是您有一個可靠的空字符串默認值,直到第一次保存新值爲止。在大多數String
箱子一個空字符串可以被當作沒有價值,可與.isEmpty
財產
很容易地檢查現在寫只是
userTextField.stringValue = userDefaults.stringForKey("user")!
沒有默認屬性列表中的任意操縱文件中的值保證從不nil
,可以安全地解開包裝,使用時不需要進行類型鑄造。
nil-coalescing操作符相當甜美。 甚至可以使用數組:)以真棒。 var paths = userDefaults.arrayForKey(Constants.PATHS)?? [String]() – kent