Swift 4でCodableを使用してコードをアップグレードしたり減らしたりする際に、クラス/参照型の動作がどのように変化するのか分かりません。リファレンスタイプ/サブクラス化、Swiftへの変更
私は2つのクラスを持っています - 永続化されるすべてのデータを持つSuperClassと、UserDefaults(場所の名前は座標で&の文字列)に保存されます。また、必要のない追加の一時的な情報を含むSubClass (SuperClass座標の気象データ)。スイフト3において
私はこのようなデータを保存するために使用される:
func saveUserDefaults() {
var superClassArray = [SuperClass]()
// subClassArray is of type [SubClass] and contains more data per element.
superClassArray = subClassArray
let superClassData = NSKeyedArchiver.archivedData(withRootObject: superClassArray)
UserDefaults.standard.set(superClassData, forKey: " superClassData")
}
スーパークラスまた、エンコード機能に必要な初期化デコーダ&を含まNSCoding NSObjectの&に準拠。 それはすべてうまくいきました。
スウィフト4に切り替える際に、&コード可能です。私はSuperClassをCodableに合わせて変更しました。 SuperClassには、基本的なイニシャライザが1つしかなく、Swift 3のエンコーダ/デコーダのものはありません。この新しいアプローチでは、KeyedArchivingは起こりません(下記参照)。 SubClassは変更されません。残念ながら、私は試しているラインでクラッシュしますか? encoder.encode [スレッド1を与える:EXC_BAD_ACCESS(コード= 1、アドレス= 0x10)]。私の前提は、エンコーダが1つのSuperClassと1つのSubClass(subClassArray [0] === superClassArray [0]が真)である同一の参照型で混乱しているということです。 私は、これがうまくいくかもしれないと思った:
func saveUserDefaults() {
var superClassArray = [SuperClass]()
superClassArray = subClassArray
// assumption was that the subclass would only contain parts of the superclass & wouldn't produce an error when being encoded
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(superClassArray){
UserDefaults.standard.set(encoded, forKey: " superClassArray ")
} else {
print("Save didn't work!")
}
}
そして、代わりに、空のsuperClassArrayを作成次に使用する: superClassArray = subClassArray、上記のように、私は単一の行でこれを置き換える:
let superClassArray: [SuperClass] = subClassArray.map{SuperClass(name: $0.name, coordinates: $0.coordinates)}
これは機能します。ここでも、クラス参照型&の中の値を渡しているので、superClassArray = subClassArrayを作成していないという前提があります。また、期待通りに、subClassArray [0] === superClassArray [0]は偽です
Swipe 3の "古いもの"は、私がletスーパークラスデータ= NSKeyedArchiverの前にsuperClassArray = subClassArrayという行を使用していたのに、 .archivedData(withRootObject:superClassArray) ? Swift 4で古いSwift 3エンコーダ/デコーダで起こっていたアレイを作成することによって、私は本質的に同じ結果を達成しましたか?ループ/レクリエーションです
ありがとう!
「JSONEncoder」によってスローされたエラーをキャッチして、それを印刷します。なぜエンコーディングが失敗しているのかがわかります。また、クラスの定義(または問題を示す簡単なバージョン)を含めることができれば、誰かがあなたを助けることができる可能性が高くなります! – idz