2016-12-15 9 views
1

У меня есть приложение в производстве. Я пытаюсь преобразовать из Swift 2.2 в Swift 3. Я пробовал код Swift 3 как в XCode 8.1, так и в XCode 8.2.NSKeyedArchiver не содержит данных Swift 3

Следующая Swift 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! 
} 

Но данные не сохранились, когда я использую тот же код преобразуется для Swift 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 d с методом convenience init?(coder aDecoder: NSCoder) в моем подклассе NSObject TruckItem.

В Swift 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 

В Swift 3, вместо того, чтобы использовать decodeObject() для всех типов свойств, оказывается есть теперь некоторые новые функции, чтобы быть в курсе. Вот те же свойства объекта декодируются в Swift 3:

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

потребовалось некоторое время для меня, чтобы обнаружить это, мы надеемся, что этот ответ спасает других пользователей от подобного разочарования.

 Смежные вопросы

  • Нет связанных вопросов^_^