vendredi 10 mars 2017

Setting value of ivar using UnsafeMutablePointer in Swift not working

I'm trying to set properties of an object using a String of the name of the property in Swift 3.

So I have the code:

 func populate(value: Any, byPropertyName name: String, intoInstance instance: inout AnyObject) {
     let namePointer = NSString(string: name).utf8String
     let ivar = class_getInstanceVariable(type(of: instance), namePointer)
     let fieldOffset = ivar_getOffset(ivar)
     let ivarName = String(cString: ivar_getName(ivar))
     print("setting value for property \(ivarName) into instance \(instance.classForCoder), offset is \(fieldOffset)")

    withUnsafeMutablePointer(to: &instance) { (pointer) -> Void in
        var pointerToField = UnsafeMutablePointer<AnyObject>(pointer + fieldOffset)
        pointerToField.pointee = value as AnyObject
        print("pointee now has value \(pointerToField.pointee)")
    }
}

@objc(TestObject) class TestObject: NSObject {
     fileprivate(set) var name: String?
     fileprivate(set) var age: Int?
     fileprivate(set) var height: Float?

     required override init() {
         super.init()
     }
 }

var object = TestObject()
var anyObject = object as AnyObject
populate(value: Int(10), byPropertyName: "age", intoInstance: &anyObject)

After this code, the age property is still nil. Anyone knows whats happening?

Thanks





Aucun commentaire:

Enregistrer un commentaire