您如何使用 perform(#selector(setter:)) 使用 swift 4 设置属性的值?

Rob*_*Rob 5 ios performselector swift

我正在尝试运行此代码,但它产生了意想不到的结果。

class Test: NSObject {
    @objc var property: Int = 0
}

var t = Test()

t.perform(#selector(setter: Test.property), with: 100)
print(t.property)
Run Code Online (Sandbox Code Playgroud)

正在打印的值是一些垃圾数字-5764607523034233277。如何使用 perform 方法设置属性的值?

rob*_*off 4

performSelector:withObject:方法需要一个对象参数,因此 Swift 将原始值 100 转换为对象引用。

setProperty:方法(即#selector(setter: Test.property)计算结果)采用一个原始NSInteger参数。因此它将对象引用视为整数。

由于这种不匹配,您无法以有意义的方式调用setProperty:using 。performSelector:withObject:

但是,您可以使用setValue:forKey:and a#keyPath代替,因为键值编码知道如何将对象转换为基元:

t.setValue(100, forKey: #keyPath(Test.property))
Run Code Online (Sandbox Code Playgroud)

  • 如果您想使用键路径,也可以执行 `t[keyPath: \Test.property] = 42`。这是一种强类型的方法。(我只是想看看有多少种不同的 Rob 可以贡献出一个答案。) (2认同)