Ios 如何使用EXPERFORM(#选择器(setter:))来使用swift 4设置属性的值?
我正在尝试运行此代码,但它产生了意外的结果Ios 如何使用EXPERFORM(#选择器(setter:))来使用swift 4设置属性的值?,ios,swift,performselector,Ios,Swift,Performselector,我正在尝试运行此代码,但它产生了意外的结果 class Test: NSObject { @objc var property: Int = 0 } var t = Test() t.perform(#selector(setter: Test.property), with: 100) print(t.property) 正在打印的值是一些垃圾号-5764607523034233277。如何使用perform方法设置属性值?performSelector:withObject:方
class Test: NSObject {
@objc var property: Int = 0
}
var t = Test()
t.perform(#selector(setter: Test.property), with: 100)
print(t.property)
正在打印的值是一些垃圾号
-5764607523034233277
。如何使用perform方法设置属性值?performSelector:withObject:方法需要一个对象参数,因此Swift正在将原语100转换为对象引用
setProperty:
方法(这是#选择器(setter:Test.property)
的计算结果)接受一个原语NSInteger
参数。因此,它将对象引用视为一个整数
由于这种不匹配,您无法使用performSelector:withObject:
以有意义的方式调用setProperty:
但是,您可以使用setValue:forKey:
和#keyPath
来代替,因为键值编码知道如何将对象转换为基本体:
t.setValue(100, forKey: #keyPath(Test.property))
由于
Int
不是arg所必需的NSObject
子类,因此不能使用perform(u:with:)
来执行该操作。要指定可以解决此问题的类型,请执行以下操作:
let setterSelector = #selector(setter: Test.property)
let setterIMP = t.method(for: setterSelector)
//Invoking setter
unsafeBitCast(setterIMP,to:(@convention(c)(Any?,Selector,Int)->Void).self)(t, setterSelector,100)
let getterSelector = #selector(getter: Test.property)
let getterIMP = t.method(for: getterSelector)
//Invoking getter
let intValue = unsafeBitCast(getterIMP,to:(@convention(c)(Any?,Selector)->Int).self)(t, getterSelector)
你可以在我的答案中找到更多的细节和例子好奇为什么你要尝试使用
perform(u:with:)
。它只能传递对象,你必须将你的属性设置为NSNumber
,这是一个很好的答案,但别忘了swift实际上没有基本类型。不过我明白你的意思。如果你想使用键路径,你也可以做t[keyPath:\Test.property]=42
。这是一种强类型的方法。(我只是想看看有多少不同的Rob可以为一个答案做出贡献。)@Rob我实际上需要一种非常通用的方法来设置各种不同对象的值。因为键路径是强类型的,所以它们对我不起作用。我刚刚发现setValue和value(forKey:)将允许我做我需要的事情。