2016-09-23 9 views
5

スウィフト3の前に、あなたはこのようにNSCoderとブール値をデコード:スイフト3:NSCoderで値をデコードする安全な方法はありますか?

aDecoder.decodeBool(forKey: TestKey) 

しかしdecodeBoolのクラス参照がない:

if let value = aDecoder.decodeObjectForKey(TestKey) as? Bool { 
    test = value 
} 

スウィフト3で提案されたアプローチではなく、これを使用することですデコードしている値が実際にブール値でない場合の状況の処理方法を説明してください。戻り値はオプションではないため、decodeBoolをletステートメントに埋め込むことはできません。

Swift 3の値を安全にデコードするにはどうすればよいですか?

+0

それはブールのを待って、それは、エラーが発生しますまあ。だからあなたはそれがブールであることを確かめなければならないのですか? – pedrouan

+0

そう、@pedrouanをチェックするのは安全な方法ではありません。エラーは迅速な2構文で捕らえられます。 – Crashalot

+0

エンコードするタイプを知っておく必要があります。これは、 'Bool'が' Bool'としてエンコードされ、 'Bool'が' Object'としてエンコードされているため、特に困難な場合があります。 http://stackoverflow.com/questions/38072295/fail-to-decode-int-with-nscoder-in-swiftを参照してください。 – Sulthan

答えて

4

わかりましたが、このような値はまだ解読できます。私はswift3としていた 問題は、符号化方式の名前の変更である:

let booleanValue = true 
coder.encode(booleanValue as Any, forKey: "myBool") 
:あなたは coder.encode(boolenValue, forKey: "myBool")とブール値をエンコードするときに、あなたがこのようにそれをエンコードするとき

// swift2: 
coder.encodeObject(Any?, forKey:String) 
coder.encodeBool(Bool, forKey:String) 

// swift3: 
coder.encode(Any?, forKey: String) 
coder.encode(Bool, forKey: String) 

は、だから、decodeBoolでそれをデコードする必要がなく、それでもこのようにそれをデコードすることができ

:aDecoder.decodeBoolに提供ブールない場合

if let value = coder.decodeObject(forKey: "myBool") as? Bool { 
    test = value 
} 
+0

これはうまく見える、試してみる。あなたはプロダクションアプリでこれを使ったことがありますか? – Crashalot

+0

さて、私はswift2コードをこのように変換しました。私が知っている問題はありません:-) – errnesto

3

これは、推奨されているdecodeBoolを使用する場合に安全です(nil-coalescing操作を使用する短いコードの場合)。

let value = aDecoder.decodeObject(forKey: TestKey) as? Bool ?? aDecoder.decodeBool(forKey: TestKey) 

decodeBoolを使用することは、Bool、IMOであることが確実な状況で可能です。

+0

'TestKey'はキーであり、値ではなく、常に* String *型です。おそらく、それは文字列定数でもあります。したがって、デコードは決して実行されません。あなたは間違ったことをテストしています。 – Codo

+0

@Codoあなたは詳しく教えていただけますか? TestKeyは文字列定数です。 Swift 3の値をデコードする安全な方法も知っていますか? – Crashalot

+1

私のコメントは、現在のものとはまったく異なる、元のバージョンの回答を指していました。 – Codo

関連する問題