通过选择器setProperty设置nsobject子类的属性

时间:2018-03-01 17:01:52

标签: swift nsobject

我有NSObject的子类,我可以使用:

设置我的子类的值
performSelector(onMainThread:  Selector("setNameOfProperty:"), with: "myName", waitUntilDone: true)

实际上,我当然没有编写任何名为setMethodProperty的方法。

所以这是我的简单课程:

class Post: NSObject {
    var name: String?
    var statusText: String?
    var profileImageName: String?
    var statusImageName: String?
    var numLikes: NSNumber?
    var numComments: NSNumber?

    var location: Location?

    override func setValue(_ value: Any?, forKey key: String) {
        if key == "location" {
            location = Location()
            location?.setValuesForKeys(value as! [String: AnyObject])
        } else {
            super.setValue(value, forKey: key)
        }
    }
}

然后从另一个类我调用方法performSelector

let samplePost = Post()
samplePost.performSelector(onMainThread:  Selector("setStatusText:"), with: "myName", waitUntilDone: true)

我正在寻找有关这件有趣事情的任何信息,但我不能。也许有人有关于它的链接或只是知道这是什么行为。如果你可以写下来澄清情况。

1 个答案:

答案 0 :(得分:1)

详细了解About Key-Value Coding中的键值编码,具体来说:

  

对象通常在从NSObject(直接或间接)继承时采用键值编码,它们都采用NSKeyValueCoding协议并为基本方法提供默认实现。这样的对象通过紧凑的消息传递接口使其他对象能够执行以下操作:

     

访问对象属性。

     

协议指定方法,例如泛型getter valueForKey:和泛型setter setValue:forKey:,用于按名称或键访问对象属性,参数化为字符串。这些和相关方法的默认实现使用键来定位基础数据并与之交互,如访问对象属性中所述。

通过继承NSObjectPost类实现NSKeyValueCoding

基本上它意味着Post中定义的属性生成相应的getter和setter方法,这意味着可以使用performSelector访问它们。此键值编码允许您执行选择器以获取或设置在编译期间您不知道的名称的属性 - 可以从字符串变量创建选择器。

如果您决定将项目迁移到Swift 4,请注意您必须使用@objc标记要以此方式访问的每个属性,或者使用@objcMembers注释全班。