简单的Swift类不能编译

时间:2014-06-25 00:30:31

标签: swift xcode6 nscoder

我的简单类ClassWithOneArray产生了这个错误:

  

Bitcast要求两个操作数都是指针,或者两个都不是%19 =   bitcast i64%18 to%objc_object *,!dbg!470 LLVM ERROR:Broken   功能发现,编译中止!命令   /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 个答案:

答案 0 :(得分:3)

正如我在评论中指出的那样,您的示例似乎在beta 2上编译得很好,但由于encoderWithCoder有任何用处,ClassWithOneArray仍然无法正常工作。需要:

  1. 声明与NSCoding的一致性,
  2. 实施NSCoding,
  3. 继承自NSObject或实现NSObjectProtocol,和
  4. 使用非破坏名称。
  5. 总而言之,这意味着:

    @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
    

答案 1 :(得分:0)

看起来您的语法对于您尝试完成的内容有点偏离 - 这样的事情应该有效:

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

答案 2 :(得分:0)

根据我的经验,只需宣布协议" NSCoding"你的班级应该做的伎俩。希望这有助于某人。