【问题标题】:Simple Swift class does not compile简单的 Swift 类无法编译
【发布时间】:2014-08-15 09:52:35
【问题描述】:

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

Bitcast 要求两个操作数都是指针或两者都不是 %19 = bitcast i64 %18 到 %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[]
    }
}

【问题讨论】:

  • 鉴于编译器正在崩溃,这很明显看起来像一个编译器错误。
  • 好的,谢谢。我将提交错误报告。
  • 这似乎用 Beta 2 编译器编译得很好。

标签: swift xcode6 nscoder


【解决方案1】:

根据我的经验,只需向您的班级声明协议“NSCoding”就可以解决问题。希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    正如我在 cmets 中指出的那样,您的示例似乎在 beta 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[]
        }
    }
    

    另外,测试归档的简单方法似乎在 Playground 中不可用,可能是因为类没有正确注册。

    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
    

    【讨论】:

    • 请注意,@rjsamson 在他的观察中也是正确的,即您错误地声明了 myArray,他对 var myArray: String[] 的使用会更好。
    • 谢谢。这在多个层面上对我有帮助。
    【解决方案3】:

    看起来你的语法对于你想要完成的事情有点偏离 - 这样的事情应该可以工作:

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

    【讨论】:

    • 谢谢,但我在 Build 上仍然遇到同样的错误,只有在我注释掉 ClassWithOneArray 时才会消失,就像我的代码一样
    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 2018-02-17
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2020-11-13
    相关资源
    最近更新 更多