I'm trying to run this code but it's yielding unexpected results.
class Test: NSObject {
@objc var property: Int = 0
}
var t = Test()
t.perform(#selector(setter: Test.property), with: 100)
print(t.property)
The value being printed is some junk number -5764607523034233277. How can I set the value of a property using the perform method?
The
performSelector:withObject:method requires an object argument, so Swift is converting the primitive 100 to an object reference.The
setProperty:method (which is what#selector(setter: Test.property)evaluates to) takes a primitiveNSIntegerargument. So it is treating the object reference as an integer.Because of this mismatch, you cannot invoke
setProperty:usingperformSelector:withObject:in a meaningful way.You can, however, use
setValue:forKey:and a#keyPathinstead, because Key-Value Coding knows how to convert objects to primitives: