2014-07-05 2 views
5

Я пытаюсь выполнить базовую реализацию протокола NSCoding в swift, но, похоже, я не могу добиться успеха, чтобы удалить архив после того, как он был правильно архивирован.NSKeyedUnarchiver не может декодировать пользовательский объект в swift

Вот моя попытка

import Cocoa 

class User: NSObject, NSCoding { 
    var name: String 

    init(name: String) { 
     self.name = name 
    } 

    init(coder aDecoder: NSCoder!) { 
     self.name = aDecoder.decodeObjectForKey("name") as String 
    } 

    func encodeWithCoder(aCoder: NSCoder!) { 
     aCoder.encodeObject(name, forKey: "name") 
    } 
} 

let user = User(name: "Gabriele") 
let encodedUser = NSKeyedArchiver.archivedDataWithRootObject(user) 
let decodedUser = NSKeyedUnarchiver.unarchiveObjectWithData(encodedUser) as User 

Запуск этого на детской площадке, он запускает исключение на последней строке. Вот подробности

Execution was interrupted, reason: signal SIGABRT. 
The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation. 
* thread #1: tid = 0x433bc, 0x00007fff9325e37a libsystem_kernel.dylib`__pthread_kill + 10, queue = 'com.apple.main-thread', stop reason = signal SIGABRT 
    * frame #0: 0x00007fff9325e37a libsystem_kernel.dylib`__pthread_kill + 10 
    frame #1: 0x00007fff8c3618f7 libsystem_pthread.dylib`pthread_kill + 90 
    frame #2: 0x00007fff935b462b libsystem_c.dylib`abort + 129 
    frame #3: 0x00007fff8813fa21 libc++abi.dylib`abort_message + 257 
    frame #4: 0x00007fff881679d1 libc++abi.dylib`default_terminate_handler() + 267 
    frame #5: 0x00007fff8538050d libobjc.A.dylib`_objc_terminate() + 103 
    frame #6: 0x00007fff881650a1 libc++abi.dylib`std::__terminate(void (*)()) + 8 
    frame #7: 0x00007fff88164b30 libc++abi.dylib`__cxa_throw + 121 
    frame #8: 0x00007fff8537c6a7 libobjc.A.dylib`objc_exception_throw + 341 
    frame #9: 0x00007fff8ec1962d CoreFoundation`+[NSException raise:format:] + 205 
    frame #10: 0x00007fff90dd9382 Foundation`_decodeObjectBinary + 2682 
    frame #11: 0x00007fff90dd8796 Foundation`_decodeObject + 278 
    frame #12: 0x00007fff90dfe159 Foundation`+[NSKeyedUnarchiver unarchiveObjectWithData:] + 89 

кодирования отлично работает, так как encodedUser является действительным экземпляром NSData (NSConcreteMutableData, чтобы быть точным).

Это какая-то ошибка совместимости API Cocoa в swift или я использую протокол NSCoding неправильно?

+1

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

+0

Попробуйте '@objc (User)' непосредственно перед объявлением класса, чтобы получить имя класса без искажений. –

+0

Возможный дубликат [Простой класс Swift не компилируется] (http://stackoverflow.com/questions/24398421/simple-swift-class-does-not-compile) –

ответ

0

Как отметил Мартин в комментариях, код отлично работает в скомпилированном приложении, поэтому это определенно ошибка на игровой площадке.

David, в комментариях, предложил использовать @objc(User), чтобы получить имя класса без искажений, но это не помогло в этом конкретном случае, так что - с бета-версии 2 - я до сих пор не нашел обходной путь, чтобы заставить его работать на игровой площадке.

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