Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用EXPERFORM(#选择器(setter:))来使用swift 4设置属性的值?_Ios_Swift_Performselector - Fatal编程技术网

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:)将允许我做我需要的事情。