Swift 反射 API 使您能够读取值但不能修改它们。因此,如果这对您来说已经足够了,您可以使用类似于以下的方法,它需要一个对象和您要访问的成员的标签:
func getValue<T>(object: AnyObject, memberLabel: String) -> T? {
let mirror = Mirror(reflecting: object)
for member in mirror.children {
if let _ = member.label where member.label == memberLabel,
let value = member.value as? T {
return value
}
}
return nil
}
但是如果你想修改这些值,你必须定义一个协议并使类符合它:
protocol HasHeight {
var height: Int { get set }
}
extension HasHeight {
mutating func grow() {
self.height += 5
}
}
class A : HasHeight {
var height = 10
}
class B : HasHeight {
var height = 20
}
var a = A()
print(a.height)
a.grow()
print(a.height)
var b = B()
print(b.height)
b.grow()
print(b.height)
在这里,我将其定义grow()
为协议扩展,以便在符合HasHeight
协议的每个类/结构上都可以使用它。
结果是:
10
15
20
25
您可以在别处定义它,但必须更改调用以包含&
引用:
func grow<T: HasHeight>(inout sized: T) {
sized.height += 5
}
grow(&b)