NSKeyedUnarchiver не работает со Swift 3

У меня есть следующий код, который я использую для разархивирования файла в своем приложении Mac:

func tryOpen(_ filePath: String) throws -> NSArray {
    if #available(OSX 10.11, *) {
        do {
            if let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)) {
                let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as! NSArray
                return array
            } else {
                throw NSError(domain: NSExceptionName.invalidUnarchiveOperationException.rawValue, code: 0, userInfo: nil)
            }
        } catch let ex {
            throw ex
        }
    } else {
        // Fallback on earlier versions
        let dat = try? Data(contentsOf: URL(fileURLWithPath: filePath))
        let unarchiver = NSKeyedUnarchiver(forReadingWith: dat!)
        if let array = unarchiver.decodeObject(forKey: "root") as? NSArray {
            return array
        } else {
            throw NSException(name: NSExceptionName.invalidArgumentException, reason: "Unable to unarchive file", userInfo: nil) as! Error
        }
    }
}

Однако с тех пор, как я обновился до Swift 3 в Xcode 8.0, у меня появилось следующее сообщение об ошибке: 'unarchiveTopLevelObjectWithData' is unavailable in Swift: Use 'unarchiveTopLevelObjectWithData(_:) throws' instead, что почти то же самое, верно? Поэтому я серьезно запутался, как это исправить. Это ошибка в Xcode?


person Matt    schedule 15.09.2016    source источник
comment
Ожидается NSData: try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data as NSData). Похоже, что-то просто проскользнуло через трещины в API.   -  person Rob    schedule 16.09.2016
comment
Не связано, но вы можете немного упростить это: gist.github.com/robertmryan/73c19aaed3792723ba3e8c28960d94e2   -  person Rob    schedule 16.09.2016
comment
@ Роб, это должен быть ответ, а не комментарий :)   -  person Fawkes    schedule 13.12.2016


Ответы (1)


NSKeyedUnarchiver все еще ожидает NSData:

let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data as NSData) as! NSArray

Это было исправлено в Swift 4.

person Rob    schedule 13.12.2016
comment
Исправлено в Swift 4! - person Grifas; 21.09.2017