Swift 4中如何正确使用perform(#selector(setter:))设置属性值?
解决Swift 4中用
perform(#selector(setter:))设置属性值的无效问题 嘿,这个问题我之前也踩过坑!问题的根源在于perform(_:with:)方法的参数传递规则——Objective-C的performSelector:withObject:只接受对象类型的参数,而你的property是Int(标量类型),直接传Swift的100会导致参数解析错误,所以才得到了那个莫名其妙的无效数字。
别担心,有两种简单的解决方法:
方法1:用NSNumber包装标量值
把Swift的Int包装成Objective-C能识别的NSNumber对象,再传递给perform方法:
class Test: NSObject { @objc var property: Int = 0 } var t = Test() // 将Int包装为NSNumber后传递 t.perform(#selector(setter: Test.property), with: NSNumber(value: 100)) print(t.property) // 输出100,结果正确!
这是因为Objective-C的属性setter(比如自动生成的setProperty:方法)会自动处理NSNumber到对应标量类型的转换,所以传递包装后的对象就能被正确解析。
方法2:用KVC的setValue(_:forKey:)方法(更简洁)
如果你不需要严格使用perform方法,KVC的setValue(_:forKey:)是更简单的选择,它会自动处理标量和对象的转换:
t.setValue(100, forKey: "property") print(t.property) // 同样输出100
为什么原来的代码会得到无效值?
你直接传递Swift的Int值时,perform(_:with:)会把这个数值当成一个内存指针地址来处理,而这个地址对应的内存内容是随机的垃圾数据,最终赋值给property的就是这些无效内容,也就是你看到的那个奇怪的负数。
内容的提问来源于stack exchange,提问作者Rob C
相关产品推荐
相关产品推荐

