【问题标题】:Get instance attributes dynamically Swift 3动态获取实例属性 Swift 3
【发布时间】:2017-04-17 22:35:54
【问题描述】:

我正在尝试找出一种方法来动态设置/获取类实例的属性。

用户类别:

class User: NSObject {
    var email: String = ""
    var password: String = ""
}

我正在尝试设置/获取类似这样的属性,(我知道.send() 不存在,但如果可能的话,我正试图找到类似的东西)

var user = User()
// Set
user.send('email') = "user_name@domain.com"
// Get
print(user.send('email'))

【问题讨论】:

    标签: swift key-value-coding


    【解决方案1】:

    这是Key-Value Coding

    user.setValue("user_name@domain.com", forKey:"email")
    print(user.value(forKey:"email"))
    

    【讨论】:

    • 有希望在非基于 NSObject 的类型上使用此功能吗?
    • @PauloMattos 不,这需要 objc 运行时。但是,请参阅github.com/apple/swift-evolution/blob/master/proposals/… 您几乎可以肯定永远无法以这种方式将字符串传递给非 Cocoa Swift(按设计;这是非常不安全的;至少在我们进行反射之前,但即便如此它也会非常不同)。但是我们将能够间接引用属性。今天,您通常会使用闭包来解决这些问题。
    • @PauloMattos 在 Apple 平台上,对于不继承自 NSObject 的类,您可以技术上自己通过 Obj-C 运行时执行此操作(前提是你想改变的属性暴露给 Obj-C),所以你可以做一些事情like this。这是可能的,因为 Swift 类在底层实现为 Obj-C 类。但是,是的,除了为了好玩/好奇之外,真的不要这样做。正如 Rob 所说,闭包通常是要走的路(你会注意到我们可以对 let setter = { c.str = $0 } 做同样的事情)。
    • @Hamish 我完全同意你和 Rob 的观点:基于字符串的 API 通常是一个糟糕的设计选择——我问这个问题是出于好奇!顺便说一句,感谢该要点示例代码。特别是,您的内联 函数元类型声明 确实是 :-)
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多