Простой 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 нуждается в:

  1. заявить о соответствии с NSCoding,
  2. реализовать NSCoding,
  3. наследовать от NSObject или реализовать NSObjectProtocol, и,
  4. используйте не искаженное имя.

Все сказанное означает, что:

@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[]
    }
}
Другие вопросы по тегам