简单Swift类不编译

简单Swift类不编译,swift,xcode6,nscoder,Swift,Xcode6,Nscoder,我的简单类ClassWithOneArray产生以下错误: Bitcast要求两个操作数都是指针或两者都不是%19= 比特广播i64%18到%objc_对象*!dbg!470 LLVM错误:已断开 找到函数,编译中止!命令 /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 失败,退出代码为1 然而,我的类ClassWithOneInt却没有。为什么?

我的简单类ClassWithOneArray产生以下错误:

Bitcast要求两个操作数都是指针或两者都不是%19= 比特广播i64%18到%objc_对象*!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[]
    }
}

看起来您的语法与您试图实现的目标有点不符-类似这样的东西应该可以工作:

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[]
    }
}

正如我在评论中指出的,您的示例在beta 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”就可以了。希望这对其他人有所帮助。

    考虑到编译器正在崩溃,这很明显看起来像是一个编译器错误。好的,谢谢。我将提交一份错误报告。这似乎可以用Beta 2编译器编译。谢谢,但我在构建时仍然会遇到同样的错误,只有在我用一个数组注释掉ClassWithOneArray时才会消失,就像我的代码注释一样,@rjsamson观察到您错误地声明了myArray,他使用的
    var myArray:String[]
    会更好。谢谢。这在多个层面上帮助了我。