我有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)
我正在寻找有关这件有趣事情的任何信息,但我不能。也许有人有关于它的链接或只是知道这是什么行为。如果你可以写它来澄清情况。
阅读About Key-Value Coding中有关键值编码的更多信息,具体如下:
对象通常在从NSObject(直接或间接)继承时采用键值编码,它们都采用NSKeyValueCoding协议并为基本方法提供默认实现。这样的对象通过紧凑的消息传递接口使其他对象能够执行以下操作:
访问对象属性。
该协议指定方法,例如通用getter
valueForKey:
和通用settersetValue:forKey:
,用于通过名称或键访问对象属性,参数化为字符串。这些和相关方法的默认实现使用键来定位基础数据并与其交互,如访问对象属性中所述。
通过继承NSObject
,Post
类实现NSKeyValueCoding
。
基本上它意味着Post
中定义的属性生成相应的getter和setter方法,这意味着可以使用performSelector
访问它们。此键值编码允许您执行选择器以获取或设置编译期间您不知道的名称的属性 - 可以从字符串变量创建选择器。
如果您决定将项目迁移到Swift 4,请注意您必须使用@objc
标记要以此方式访问的每个属性,或者在整个类中使用@objcMembers
批注。