2014-09-06 44 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 2014-09-06 15:57:04