Swift支持反射吗?例如,Swift对象有没有像valueForKeyPath:
和setValue:forKeyPath:
这样的东西?
实际上它有没有像Objective-C中的obj.class
这样的动态类型系统呢?
发布于 2014-06-06 04:40:44
看起来这是一些反射支持的开始:
class Fruit {
var name="Apple"
}
reflect(Fruit()).count // 1
reflect(Fruit())[0].0 // "name"
reflect(Fruit())[0].1.summary // "Apple"
出自mchambers gist,这里:https://gist.github.com/mchambers/fb9da554898dae3e54f2
发布于 2014-08-17 09:11:43
目前看来,Swift反射API对Apple来说不是一个高优先级的东西。但是,除了@stevex answer之外,标准库中还有另一个函数可以提供帮助。
从beta 6开始,_stdlib_getTypeName
获取变量的损坏类型名称。将此内容粘贴到空操场中:
import Foundation
class PureSwiftClass {
}
var myvar0 = NSString() // Objective-C class
var myvar1 = PureSwiftClass()
var myvar2 = 42
var myvar3 = "Hans"
println( "TypeName0 = \(_stdlib_getTypeName(myvar0))")
println( "TypeName1 = \(_stdlib_getTypeName(myvar1))")
println( "TypeName2 = \(_stdlib_getTypeName(myvar2))")
println( "TypeName3 = \(_stdlib_getTypeName(myvar3))")
输出为:
TypeName0 = NSString
TypeName1 = _TtC13__lldb_expr_014PureSwiftClass
TypeName2 = _TtSi
TypeName3 = _TtSS
Ewan Swick's blog entry帮助破译这些字符串:
例如,_TtSi
代表Swift的内部Int
类型。
发布于 2020-02-27 10:19:22
Swift 5中没有reflect
关键字,现在您可以使用
struct Person {
var name="name"
var age = 15
}
var me = Person()
var mirror = Mirror(reflecting: me)
for case let (label?, value) in mirror.children {
print (label, value)
}
https://stackoverflow.com/questions/24060667
复制相似问题