Swift 动态获取实例属性
我试图找到一种方法来动态设置/获取类实例的属性 用户类别:Swift 动态获取实例属性,swift,key-value-coding,Swift,Key Value Coding,我试图找到一种方法来动态设置/获取类实例的属性 用户类别: class User: NSObject { var email: String = "" var password: String = "" } 我正在尝试设置/获取类似的属性(我知道.send()不存在,但如果可能的话,我正在尝试查找类似的属性) 这是: 希望在非基于NSObject的类型上使用此功能吗?@PauloMattos不,这需要objc运行时。但是,您几乎肯定无法通过这种方式将字符串传递给非Cocoa S
class User: NSObject {
var email: String = ""
var password: String = ""
}
我正在尝试设置/获取类似的属性(我知道.send()
不存在,但如果可能的话,我正在尝试查找类似的属性)
这是:
希望在非基于NSObject的类型上使用此功能吗?@PauloMattos不,这需要objc运行时。但是,您几乎肯定无法通过这种方式将字符串传递给非Cocoa Swift(根据设计;这是非常不安全的;至少在我们有反射之前是这样,但即使这样,情况也会非常不同)。但我们可以间接引用属性。今天,您通常会使用闭包来解决这些问题。@PauloMattos在Apple平台上,对于不是从
NSObject
继承的类,您可以亲自通过Obj-C运行时来完成这项工作(前提是您要更改的属性已公开给Obj-C),这样您就可以做一些事情。这是可能的,因为Swift类在引擎盖下实现为Obj-C类。但是,是的,除了好玩/好奇,真的不要这样做。正如Rob所说,闭包通常是一种方式(你会注意到我们可以用let setter={c.str=$0}
)做同样的事情。@Hamish我完全同意你和Rob的观点:基于字符串的API通常是一个糟糕的设计选择——我问这个问题是出于好奇!顺便说一句,谢谢你的示例代码。特别是,您的内联函数元类型声明确实很重要:-)
var user = User()
// Set
user.send('email') = "user_name@domain.com"
// Get
print(user.send('email'))
user.setValue("user_name@domain.com", forKey:"email")
print(user.value(forKey:"email"))