2015-09-09 3 views
5

My Appは、プロパティを持つクラスのインスタンスをアーカイブすることで、設定をiOSデバイス上のファイルに保存します。クラスはNSCodingプロトコルを使用するため、これらのプロパティはencodeWithCoderを使用してエンコードします。 tempInt = decoder.decodeIntegerForKey("profileFlags") as Int0ではなくdecodeIntegerForKeyからオプションを取得するにはどうすればよいですか?

これはうまくいきましたが、今では追加のプロパティを保存して取得できる必要があります。本質的には、このアーカイブされたオブジェクトの構造は変更されていますが、ユーザーは既に古い構造(プロパティが少ない)のファイルを既に持っています。ユーザーが新しい構造(追加のプロパティ)を持つファイルを持っている場合、それらを読みたいと思います。もしそうでなければ、それを処理してデフォルト値を提供するコードを実行できるようにしたい。

存在しないキーtempInt = decoder.decodeIntegerForKey("nonExistentKey") as Intを使用しようとしましたが、ゼロの値を取得することを期待しましたが、ゼロを返しました。残念ながら、これは0が有効な値であるため、実際にはオプションが必要な場所です。

最も近いヘルプ記事はSwift: decodeObjectForKey crashes if key doesn't existですが、ここでは該当しないようです。 decodeObjectForKeyはオプションのものを返し、decodeIntegerForKeyはIntegerを返します。

これを行う方法に関するアイデアはありますか?あなたがdecoder.containsValueForKey("nonExistentKey")天気をかそこに存在する実際の値であり、それはdecodeIntegerForKeyでそれを抽出している場合にのみ使用して確認することができます

答えて

7

:luk2302 @

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

"エンコードされた整数がデフォルトの整数サイズに収まらない場合、このメソッドはNSRangeExceptionを発生させます。"残念ながら、それをSwiftで処理するのは難しいです。 – jtbandes

0

はあなたに答えを与えたが、私は少し構文を調整したいですその上に展開します。

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

最後のステートメントと同じ効果がある「第3級演算子」、使用している:

...しかし、すべて1行にあります。あなたがそれに慣れるまで少し奇妙に見えますが、このようなことを表現するのは非常に簡潔な方法です。

0

ゼロの代わりにnilを返すdecodeObjectForKeyを使用できます。

decoder.decodeObjectForKey("profileFlags") as? Int 
関連する問題