Простой Swift класс не компилируется
Мой простой класс, ClassWithOneArray, выдает эту ошибку:
Для Bitcast требуется, чтобы оба операнда были указателями, или ни один из%19 = bitcast i64 %18 to %objc_object*,! Dbg!470 ОШИБКА LLVM: Обнаружена неисправная функция, компиляция прервана! Команда /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift не выполнена с кодом выхода 1
Однако мой класс ClassWithOneInt этого не делает. Зачем?
class ClassWithOneInt {
var myInt = Int()
init(myInt: Int) {
self.myInt = Int()
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(myInt, forKey: "myInt")
}
init(coder aDecoder: NSCoder) {
self.myInt = aDecoder.decodeObjectForKey("myInt") as Int
}
}
class ClassWithOneArray {
var myArray = String[]()
init(myArray: String[]) {
self.myArray = String[]()
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(myArray, forKey: "myArray")
}
init(coder aDecoder: NSCoder) {
self.myArray = aDecoder.decodeObjectForKey("myArray") as String[]
}
}
3 ответа
Как я отмечаю в комментариях, ваш пример, похоже, прекрасно компилируется на бета-версии 2, хотя он все равно не будет работать по нескольким причинам, поскольку encoderWithCoder
быть полезным, ClassWithOneArray
нуждается в:
- заявить о соответствии с NSCoding,
- реализовать NSCoding,
- наследовать от NSObject или реализовать NSObjectProtocol, и,
- используйте не искаженное имя.
Все сказанное означает, что:
@objc(ClassWithOneArray)
class ClassWithOneArray:NSObject, NSCoding {
var myArray: String[]
init(myArray: String[]) {
self.myArray = myArray
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(myArray, forKey: "myArray")
}
init(coder aDecoder: NSCoder) {
self.myArray = aDecoder.decodeObjectForKey("myArray") as String[]
}
}
Также кажется, что простые методы тестирования архивации недоступны на игровой площадке, возможно потому, что классы не зарегистрированы должным образом.
let foo = ClassWithOneArray(myArray:["A"])
let data = NSKeyedArchiver.archivedDataWithRootObject(foo)
let unarchiver = NSKeyedUnarchiver(forReadingWithData:data)
unarchiver.setClass(ClassWithOneArray.self, forClassName: "ClassWithOneArray")
let bar = unarchiver.decodeObjectForKey("root") as ClassWithOneArray
По моему опыту, просто объявление протокола "NSCoding" вашему классу должно помочь. Надеюсь, это кому-нибудь поможет.
Похоже, ваш синтаксис немного не подходит для того, что вы пытаетесь достичь - что-то вроде этого должно работать:
class ClassWithOneInt {
var myInt: Int
init(myInt: Int) {
self.myInt = myInt
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(myInt, forKey: "myInt")
}
init(coder aDecoder: NSCoder) {
self.myInt = aDecoder.decodeObjectForKey("myInt") as Int
}
}
class ClassWithOneArray {
var myArray: String[]
init(myArray: String[]) {
self.myArray = myArray
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(myArray, forKey: "myArray")
}
init(coder aDecoder: NSCoder) {
self.myArray = aDecoder.decodeObjectForKey("myArray") as String[]
}
}