How does mirror get attributes, numbers, and values through reflectionSwift finds the initializer on the right, another if statement, the first is a custom initializer, the second is a system initializer, and the second is the system initializer

Mirror acquisition type

The whole process of finding a struct type can be seen in the figure above

Number of attributes

The attribute name

StructMetadata {var kind: {// type: {// type: {// type: {// type: {// type: {// type: {// type: { Int var description: UnsafeMutablePointer<StructMetadataDesc>} UnsafeMutablePointer< structmetadadEsc >} UnsafeMutablePointer<StructMetadataDesc>} Var FLAGS: UInt32 // Var parent: UInt32 // Var name inherited from TargetContextDescriptor: RelativeDirectPointer < CChar > / / TargetTypeContextDescriptor attribute var accessFunctionPtr: RelativeDirectPointer < UnsafeRawPointer > / / TargetTypeContextDescriptor attribute var fields: RelativeDirectPointer < FieldDescriptor > / / TargetTypeContextDescriptor attribute var numFields: UInt32 // Number of attributes // Attribute of TargetStructDescriptor} struct FieldDescriptor {var MangledTypeName: RelativeDirectPointer<CChar> var Superclass: RelativeDirectPointer<CChar> var Kind: UInt16 var FieldRecordSize: UInt16 var NumFields: UInt32 var fields: FieldRecord} struct FieldRecord {var flag: UInt32 var MangledTypeName: RelativeDirectPointer<CChar> var fieldName: RelativeDirectPointer<CChar>} struct RelativeDirectPointer<T> { Mutating func get() -> UnsafeMutablePointer<T> {let offset = self. Offset return withUnsafePointer(to: &self) {p in return UnsafeMutablePointer(mutating: UnsafeRawPointer(p).advanced(by: numericCast(offset)).assumingMemoryBound(to: T.elf))}}} struct Person {var name = "ph" var age = 10} Let PTR = unsafeBitCast(person. self as any. Type, to: UnsafeMutablePointer<StructMetadata>.self) let name = ptr.pointee.description.pointee.name.get() let count = ptr.pointee.description.pointee.numFields print(count) print(String(cString: name)) let fieldName = ptr.pointee.description.pointee.fields.get().pointee.fields.fieldName.get() print(String(cString:  fieldName))Copy the code