16

プロジェクトを Swift 3 に移行しましたが、NSKeyedArchiver機能しません。次のようにオブジェクトをデコードしようとすると、実際に実行時エラーが発生します。

let startDayTime = aDecoder.decodeObject(forKey: Key.startDayTime) as! Int

Xcode 7.3 の Swift 2.2 で完全に機能しました。他の誰かがそのようなトラブルに直面したことがありますか?

PSシミュレーターとデバイスの両方でこのエラーが発生しました。

4

4 に答える 4

16

これは、Swift 2 で a でアーカイブされた NSData blob が Swift 3 で a で開かれた場合に、Swift 2 から Swift 3 への更新境界でのみ発生するようNSKeyedArchiverですNSKeyedUnarchiver。3、それらは rawおよび型としてエンコードされます。次のテストがこの主張を裏付けていると思います。BoolIntNSNumberBoolInt

これは Swift 3 で機能し、Swift 2 でエンコードされた a を解凍しますが、Bool が Swift 3 でエンコードされた場合はBool戻ります。nil

let visible = aDecoder.decodeObject(forKey: "visible") as? Bool

これは、Swift 3 でBoolエンコードされた a を展開するために Swift 3 で機能しますが、Bool が Swift 2 でエンコードされた場合はクラッシュします。

let visible = aDecoder.decodeBool(forKey: "visible")

私の解決策は次のとおりです。

let visible = aDecoder.decodeObject(forKey: "visible") as? Bool ?? aDecoder.decodeBool(forKey: "visible")
于 2016-10-14T03:56:18.570 に答える
1

スウィフト 3 :

二重疑問符( ?? ) 方式を採用しており、たった 1 行でうまく機能します。

val が nil でない場合、ラップが解除され、値が返されます。nil の場合は次がaDecoder.decodeInteger(forKey: "val")返されます。

self.val = aDecoder.decodeObject(forKey: "val") as? Int ?? aDecoder.decodeInteger(forKey: "val")
于 2016-10-15T13:06:52.727 に答える