2016-12-15 7 views
1

私はSwift 2.2からSwift 3に変換しようとしています。Xcode 8.1とXcode 8.2の両方でSwift 3コードを試しました。NSKeyedArchiverがデータを永続化しないSwift 3

以下スイフト2のコードは完璧に動作:

func saveItemsToCache() { 
    NSKeyedArchiver.archiveRootObject(items, toFile: itemsCachePath) 
} 

func loadItemsFromCache() { 
    if let cachedItems = NSKeyedUnarchiver.unarchiveObjectWithFile(itemsCachePath) as? [TruckItem] { 
     items = cachedItems 
    } 
} 

var itemsCachePath: String { 
    let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] 
    let fileURL = documentsURL.URLByAppendingPathComponent("Trucks.dat") 
    return fileURL.path! 
} 

しかし、私は同じ符号がスイフト3用に変換使用する場合、データは永続化されていない。

func saveItemsToCache() { 
    print("SAVED TRUCKS:", items) 
    NSKeyedArchiver.archiveRootObject(items, toFile: itemsCachePath) 
} 

func loadItemsFromCache() { 
    if let cachedItems = NSKeyedUnarchiver.unarchiveObject(withFile: itemsCachePath) as? [TruckItem] { 
     items = cachedItems 
     print("LOADED TRUCKS:", items) 
    } 
} 

var itemsCachePath: String { 
    let documentsURL = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first! 
    let fileURL = documentsURL.appendingPathComponent("Trucks.dat") 
    return fileURL.path 
} 

例コンソール出力:

SAVED TRUCKS: [<TruckTelematics.TruckItem: 0xc852380>, <TruckTelematics.TruckItem: 0x9b23ba0>] 

LOADED TRUCKS: [] 

答えて

0

私は最近、この問題がNSKeyedArchiverではなく、Instea NSObjectのサブクラスTruckItemconvenience init?(coder aDecoder: NSCoder)メソッドを追加しました。

スウィフト2.2では、あなたはこのように異なるオブジェクトのプロパティをデコードします:

let IMEI = aDecoder.decodeObject(forKey: CodingKeys.IMEI) as! String 
let active = aDecoder.decodeObject(forKey: CodingKeys.active) as! Bool 
let daysInactive = aDecoder.decodeObject(forKey: CodingKeys.daysInactive) as! Int 

スウィフト3では、代わりに、すべてのプロパティタイプのためdecodeObject()を使用するのでは、それが表示されます。注意すべきいくつかの新機能が存在することになります。ここでは、同じオブジェクトのプロパティは、スウィフト3でデコードされています

let IMEI = aDecoder.decodeObject(forKey: CodingKeys.IMEI) as! String 
let active = aDecoder.decodeBool(forKey: CodingKeys.active) 
let daysInactive = aDecoder.decodeInteger(forKey: CodingKeys.daysInactive) 

私はこれを発見することができれば、この答えは同様の不満から、他のユーザーを保存し、かなりの時間を要しました。

関連する問題