Simple Swift class does not compile

后端 未结 3 501
挽巷
挽巷 2021-01-21 06:43

My simple class, ClassWithOneArray, produces this error:

Bitcast requires both operands to be pointer or neither %19 = bitcast i64 %18 to %objc_object

相关标签:
3条回答
  • 2021-01-21 06:59

    In my experience simply declaring the Protocol "NSCoding" to your class should do the trick. Hope this helps someone.

    0 讨论(0)
  • 2021-01-21 07:04

    As I point out in comments, your example seems to compile fine on beta 2, although it still won't work for a couple of reasons, for encoderWithCoder to be of any use, ClassWithOneArray needs to:

    1. declare conformance with NSCoding,
    2. implement NSCoding,
    3. inherit from NSObject or implement NSObjectProtocol, and,
    4. use a non-mangled name.

    All told, that means:

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

    Also it seems as if the simple methods of testing archiving aren't available in the playground, probably because the classes don't get properly registered.

    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
    
    0 讨论(0)
  • 2021-01-21 07:09

    It looks like your syntax is a bit off for what you're trying to accomplish - something like this should work:

    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[]
        }
    }
    
    0 讨论(0)
提交回复
热议问题