Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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
Swift 动态获取实例属性_Swift_Key Value Coding - Fatal编程技术网

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"))