2016-04-08 24 views
1

我有一些代碼來獲得一個串出userDefaults的:展開和鑄造的最簡潔的方式可選

if let userString = (userDefaults.objectForKey("user")) { 
    userTextField.stringValue = userString as! String 
} 

首先,我必須看到,如果選購的是不是nil。然後我必須將它從AnyObject中轉換爲一個字符串。

有沒有更好的方法來做到這一點?也許是一個班輪?

回答

2

請注意,如果存在密鑰「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)" 
+0

nil-coalescing操作符相當甜美。 甚至可以使用數組:)以真棒。 var paths = userDefaults.arrayForKey(Constants.PATHS)?? [String]() – kent

0

,我喜歡很多清理它的另一種方式是做每個檢查 第一,並退出如有不符合。這允許容易理解條件將使該函數退出的條件。

雨燕這也可以用來避免使用武力展開崩潰是一個非常有趣的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語句,該語句脫離該函數。 如果條件通過,則此處的可選變量將自動在您調用的警戒語句爲 的範圍內展開爲您打開 。

1

對於特殊情況NSUserDefaults最好的和推薦的方法是始終使用非可選值。

首先儘快在AppDelegate中註冊鍵/值對,但至少在使用之前。

let defaults = NSUserDefaults.standardUserDefaults() 
let defaultValues = ["user" : ""] 
defaults.registerDefaults(defaultValues) 

好處是您有一個可靠的空字符串默認值,直到第一次保存新值爲止。在大多數String箱子一個空字符串可以被當作沒有價值,可與.isEmpty財產

很容易地檢查現在寫只是

userTextField.stringValue = userDefaults.stringForKey("user")! 

沒有默認屬性列表中的任意操縱文件中的值保證從不nil,可以安全地解開包裝,使用時不需要進行類型鑄造。

+0

我真的很喜歡這樣的安全。我認爲將它與常量的關鍵值結合起來,以防止拼寫錯誤,我會贏得勝利。 – kent

+1

嚴格來說,stringForKey(「user」)仍然可以返回零(例如,如果用戶首選項已設置爲具有不同類型(例如數組)的值)。 –

+0

@MartinR足夠的必須捕捉用戶可能導致的所有可能的錯誤,我們是否真的需要將其擴展到開發者的疏忽? ;-) – vadian

相關問題