2015-09-09 77 views
5

我的應用通過歸檔具有屬性的類的實例將設置保存到iOS設備上的文件。該類使用NSCoding協議,因此,我使用encodeWithCoder對這些屬性進行編碼。然後,我嘗試使用諸如tempInt = decoder.decodeIntegerForKey("profileFlags") as Int如何從decodeIntegerForKey而不是0獲得可選項?

這樣的命令將這些文件讀回到內存中,目前爲止這種方法運行良好,但現在我需要能夠存儲其他屬性並檢索它們。本質上,這個存檔對象的結構正在改變,但用戶已經擁有舊結構的文件(屬性更少)。如果用戶具有新結構的文件(附加屬性),那麼我想閱讀它們。如果不是,我希望能夠執行代碼來處理它並提供默認值。

我嘗試使用不存在的鍵tempInt = decoder.decodeIntegerForKey("nonExistentKey") as Int,希望得到一個零值,但它返回一個零。不幸的是,這是我真的需要一個可選的地方,因爲0是一個有效的值。

我能找到的最近的幫助文章是Swift: decodeObjectForKey crashes if key doesn't exist,但這似乎並不適用於此。這看起來像decodeObjectForKey返回一個可選的和decodeIntegerForKey返回一個Integer。

有關如何做到這一點的任何想法?

回答

7

您可以檢查使用decoder.containsValueForKey("nonExistentKey")羯羊或不存在的實際值存在,並且僅當它是與decodeIntegerForKey提取它:

if decoder.containsValueForKey("nonExistentKey") { 
    let tempInt = decoder.decodeIntegerForKey("nonExistentKey") 
} 
+0

「如果編碼的整數不適合默認的整數大小,則該方法產生一個NSRangeException。不幸的是,在Swift中很難處理這個問題。 – jtbandes

0

@ luk2302給你答案,但我想稍微調整一下語法並擴大它:

var tempInt: Int? 
let key = "profileFlags" 
let hasValue = decoder.containsValueForKey(key) 
tempInt = hasValue ? decoder.decodeIntegerForKey(key) : nil 

使用「三級運營商」,它具有相同的效果最後一條語句:

if hasValue 
{ 
    tempInt = decoder.decodeIntegerForKey(key) 
} 
else 
{ 
    tempInt = nil 
} 

...但全部在1行。在你習慣之前,它有點奇怪,但它是表達這種事物的一種非常簡潔的方式。

0

您可以使用返回nil而不是零的decodeObjectForKey。你只需要按照下面的方法轉換爲Int:

decoder.decodeObjectForKey("profileFlags") as? Int 
相關問題