2014-09-06 4 views
0
import Foundation 

class C: NSObject, NSCoding { 
    var n: String = "" 

    override init() { 
     super.init() 
     n = "instance of class C" 
    } 

    convenience init(_ name: String) { 
     self.init() 
     n = name 
    } 

    required init(coder: NSCoder) { 
     // self.init() 
     // super.init() 
     // super.init(coder) 
     n = coder.decodeObjectForKey("name") as String 
    } 

    func encodeWithCoder(coder: NSCoder) { 
     coder.encodeObject(n, forKey:"name") 
    } 

    override var description: String { 
     get { return "C instance: \(n)" } 
    } 
} 

let c = C("Tom") 
println(c) 
if NSKeyedArchiver.archiveRootObject(c, toFile: "demo") { 
    println("OK") 
} 
let c2: C = NSKeyedUnarchiver.unarchiveObjectWithFile("demo") as C 

Составитель в командной строке сКак реализовать NSCoding

xcrun swift coder.swift 

Вызов NSKeyedUnarchiver.unarchiveObjectWithFile терпит неудачу, врезавшись с этим

> xcrun swift coder.swift 
C instance: Tom 
OK 
2014-09-06 10:45:11.925 swift[483:100b] *** Terminating app due to uncaught exception 
'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (coder.C)' 

Я посмотрел на различные «рабочие примеры», но они кажется, не работают для меня. Ни одна из прокомментированных строк не работает или не помогает. Что я делаю не так?

ответ

1

Я рекомендую открыть радар (bugreport.apple.com). Это отлично работает, если вы скомпилируете его, а не пытаетесь запустить его напрямую через интерпретатор swift. Он работает в Xcode. Он работает на игровых площадках. Он работает с xcrun -sdk macosx swiftc coder.swift && ./coder. Единственный случай, когда он не работает, - swift.

+0

Спасибо. Сейчас работает для меня. Я посмотрю, как подать радар. – telliott99