Slide 1

Slide 1 text

4XJGUͱϝλσʔλ Š4XJGUѪ޷ձWPM ! !OPQQFGPYXPMG

Slide 2

Slide 2 text

OPQQF ! ͖ͭͶ͕޷͖ʂʂ " J04ΞϓϦ։ൃ೥໨ 4XJGUѪ޷ձॳࢀઓ ! !OPQQFGPYXPMG

Slide 3

Slide 3 text

! !OPQQFGPYXPMG

Slide 4

Slide 4 text

ϝλσʔλͱ͸ ϝλ৘ใͱ͸ɺ͢ͳΘͪσʔλʹ͍ͭͯͷσʔλͱ͍͏ ҙຯͰɺ͋Δσʔλ͕෇ਵͯ࣋ͭͦ͠ͷσʔλࣗ਎ʹͭ ͍ͯͷ෇ՃతͳσʔλΛࢦ͢ɻʢ8JLJௐ΂ʣ ! IUUQTKBXJLJQFEJBPSHXJLJϝλσʔλ ! !OPQQFGPYXPMG

Slide 5

Slide 5 text

ϝλσʔλͱ͸ ‣ Ϋϥε໊ ‣ ΫϥεͷϓϩύςΟ໊ ‣ ܧঝݩ ‣ ४ڌ͍ͯ͠Δϓϩτίϧ FUD ! !OPQQFGPYXPMG

Slide 6

Slide 6 text

ϝλσʔλ͕ඞཁͳ࣌ ‣ ࠓݟ͍ͯΔϏϡʔίϯτϩʔϥΛϩάʹు͖͍ͨ ‣ ΠϯελϯεΛμϯϓͯ͠อଘ͍ͨ͠ ‣ ৄࡉͰ෼͔Γ΍͍͢ΤϥʔΛද͍ࣔͨ͠ ‣ ͍͍ײ͡ͷ03.࡞Γ͍ͨͱ͔ FUD ! !OPQQFGPYXPMG

Slide 7

Slide 7 text

4XJGUͰϝλσʔλΛऔಘ͢Δʹ͸Ͳ͏͢Ε͹͍͍ʁ ! !OPQQFGPYXPMG

Slide 8

Slide 8 text

ͦ͏͍͑͹0CKFDUJWF$Ͱ͸Ͳ͏͍ͯͨ͠ͷ͔ʁ ! !OPQQFGPYXPMG

Slide 9

Slide 9 text

ϓϩύςΟҰཡΛऔಘ͢Δ 0CKFDUJWF$SVOUJNF"1* class_copyPropertyList(_:_:) IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPO PCKFDUJWFDDMBTT@DPQZQSPQFSUZMJTU ! !OPQQFGPYXPMG

Slide 10

Slide 10 text

ϓϩύςΟҰཡΛऔಘ͢Δ unsigned int propertyCount = 0; objc_property_t * properties = class_copyPropertyList([self class], &propertyCount); NSMutableArray * propertyNames = [NSMutableArray array]; for (unsigned int i = 0; i < propertyCount; ++i) { objc_property_t property = properties[i]; const char * name = property_getName(property); [propertyNames addObject:[NSString stringWithUTF8String:name]]; } free(properties); NSLog(@"Names: %@", propertyNames); ! !OPQQFGPYXPMG

Slide 11

Slide 11 text

ϓϩύςΟҰཡΛऔಘ͢Δ 0CK$SVOUJNF"1*͸4XJGUͰ΋࢖͏͜ͱ͕Ͱ͖Δɻ import ObjectiveC ! !OPQQFGPYXPMG

Slide 12

Slide 12 text

ϓϩύςΟҰཡΛऔಘ͢Δ var count: UInt32 = 0 let properties = class_copyPropertyList(MyClass.self, &count) for i in 0..

Slide 13

Slide 13 text

ϓϩύςΟҰཡΛऔಘ͢Δ 4XJGUͰDMBTT@DPQZ1SPQFSUZ-JTUΛ࢖͏ʹ͸੍ݶ͕͋Δ class MyClass: NSObject { @objc var prop1 = "" @objc var prop2 = "" } ϓϩύςΟʹ@objcΛ͚ͭΔ͜ͱʂ˞ ˞!PCKD͕ඞཁͰ͋Γɺ/40CKFDUΛܧঝ͢Δඞཁ͸ͳ͍ɻ·ͨ!PCKDΛ͚ͭΔʹ͸DMBTTͰ͋Δඞཁ͕͋Δ ! !OPQQFGPYXPMG

Slide 14

Slide 14 text

!PCKDΛ෇͚ͣʹϓϩύ ςΟҰཡΛऔಘ͢Δํ๏͸ ͳ͍Ͱ͠ΐ͏͔ʜʁ ! !OPQQFGPYXPMG

Slide 15

Slide 15 text

ϓϩύςΟҰཡΛऔಘ͢Δ &ODPEBCMF class MyClass: Encodable { var prop1 = "" var prop2 = "" } let data = try! JSONEncoder().encode(MyClass()) let json = try! JSONSerialization.jsonObject(with: data, options: .allowFragments) print((json as! [String : Any]).keys) ‣ <QSPQ QSPQ> ! !OPQQFGPYXPMG

Slide 16

Slide 16 text

SFqFDUJPO let mirror = Mirror(reflecting: MyClass()) let propNames = mirror.children.compactMap({ $0.label }) ! !OPQQFGPYXPMG

Slide 17

Slide 17 text

0CKFDUJWF$SVOUJNF "1*ʹ૬౰͢Δ GSBNFXPSL͸ແ͍ͷ͔ʜ ! !OPQQFGPYXPMG

Slide 18

Slide 18 text

TXJGUEPDT3VOUJNFNE 5IFpOBMSVOUJNFJOUFSGBDFJTDVSSFOUMZ BXPSLJOQSPHSFTT ͳͦ͞͏ IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT3VOUJNFNE ! !OPQQFGPYXPMG

Slide 19

Slide 19 text

5IJSEQBSUZSVOUJNF"1* IUUQTHJUIVCDPNXJDLXJSFX3VOUJNF IUUQTHJUIVCDPN;FXP3FqFDUJPO ! !OPQQFGPYXPMG

Slide 20

Slide 20 text

XJDLXJSFX3VOUJNF var md = ClassMetadata(type: MyClass.self) let info = md.toTypeInfo() info.properties.compactMap { $0.name } ! !OPQQFGPYXPMG

Slide 21

Slide 21 text

1SPT$POT !PCKD JOTUBODF NFUBEBUB 0CK$SVOUJNF Y P P &ODPEBCMF P Y Y SFqFDUJPO P Y ˚ UIJSEQBSUZBQJ P P P ! !OPQQFGPYXPMG

Slide 22

Slide 22 text

☺ Š͡Ό͋5IJSEQBSUZͷ࢖͓͏ʙʙ ! !OPQQFGPYXPMG

Slide 23

Slide 23 text

3VOUJNF΍3FqFDUJPO͸ Ͳ͏΍ͬͯϝλσʔλΛऔ ಘ͍ͯ͠Δͷ͔ʁ ! !OPQQFGPYXPMG

Slide 24

Slide 24 text

3VOUJNFͷॲཧ 5ZQF͕อ࣋͞Ε͍ͯΔϝϞϦΛ௚઀ࢀরͯ͠ϝλσʔ λΛऔಘ͍ͯ͠Δɻ ͜ΕΒΛߏ଄ମʹ౰ͯቕΊͯ࢖͍΍͍͢Α͏ʹͨ͠ϥΠ ϒϥϦ ϝϞϦͷϨΠΞ΢τߏ଄͸υΩϡϝϯτ͕͋Δ ! !OPQQFGPYXPMG

Slide 25

Slide 25 text

! !OPQQFGPYXPMG

Slide 26

Slide 26 text

! !OPQQFGPYXPMG

Slide 27

Slide 27 text

45&1 var type: Any.Type = Kind.self let typeAsPointer = unsafeBitCast(type, to: UnsafeMutablePointer.self) let metadataPointer = typeAsPointer.advanced(by: -1) let metadataRawPointer = UnsafeMutableRawPointer(metadataPointer) UZQFࣗମͷϙΠϯλ͔ΒੜϙΠϯλΛऔಘ͢Δ ! !OPQQFGPYXPMG

Slide 28

Slide 28 text

! !OPQQFGPYXPMG

Slide 29

Slide 29 text

<ิ଍>WBMVFXJUOFTTUBCMF ؔ਺Λݺͼग़࣌͢ʹܦ༝͢Δςʔϒϧ 3VOUJNFͰ͸͜ͷαΠζ΍ॱংΛݩʹΠϯελϯεͷϝ ϞϦߏ଄Λ࡞Γग़ͯ͠ແཧ΍Γੜ੒͢Δػೳ͕͋Δ ! !OPQQFGPYXPMG

Slide 30

Slide 30 text

45&1 let layout = metadataRawPointer.assumingMemoryBound(to: StructMetadataLayout.self) assumingMemoryBoundͰϙΠϯλΛ .FUBEBUB-BZPVUͷߏ଄΁ͷϙΠϯλͱղऍ͠·͢ɻ ! !OPQQFGPYXPMG

Slide 31

Slide 31 text

45&1 4USVDU.FUBEBUB-BZPVUTXJGU struct StructMetadataLayout: NominalMetadataLayoutType { var valueWitnessTable: UnsafePointer var kind: Int var nominalTypeDescriptor: UnsafeMutablePointer } ! !OPQQFGPYXPMG

Slide 32

Slide 32 text

45&1 structLayout.kind //1 enumLayout.kind //2 protocolLayout.kind //12 ͜ΕͰϝϞϦͷߏ଄ΛTUSVDUʹϚοϐϯά͢Δࣄ͕ग़དྷ ͨ ! !OPQQFGPYXPMG

Slide 33

Slide 33 text

45&1 Nominal Type Descriptorͷoffset: ͕̐field namesͳͷͰͦ͜ͷ࣮ମΛࢀর͢ΔͱɺϓϩύςΟ໊ͷ $4USJOHͷ഑ྻ͕औಘͰ͖Δɻ ! !OPQQFGPYXPMG

Slide 34

Slide 34 text

45&1 struct Animal { var name: String } let cString = metadata.pointee.nominalTypeDescriptor.pointee.fieldNames.advanced() String(cString: cString) → name $4USJOHͷࢀরΛ4USJOHʹม׵͢ΔͱɺϓϩύςΟ໊͕ औಘͰ͖Δɻ ! !OPQQFGPYXPMG

Slide 35

Slide 35 text

45&1 ͋ͱ͸͜ͷ$4USJOHͷࢀরΛϓϩύςΟ෼ζϥͯ͠औಘ ͍͚ͯ͠͹ɺશͯͷϓϩύςΟ໊͕औಘͰ͖Δɻ ࣮ࡍ͸ଞͷϙΠϯλ͔ΒϓϩύςΟͷ਺Λऔಘͯͦ͠ͷ෼Λऔಘ͍ͯ͠Δ ! !OPQQFGPYXPMG

Slide 36

Slide 36 text

8BSOJOH ͜ͷํ๏͸౰વ4XJGUͷ࢓༷มߋͰϝϞϦͷϨΠΞ΢τ ͕มΘΔͱ࢖͑ͳ͘ͳΔɻ 4XJGU"#*4UBCJMJUZ.BOJGFTUP IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT"#*4UBCJMJUZ.BOJGFTUPNE ! !OPQQFGPYXPMG

Slide 37

Slide 37 text

&YBNQMFQSPKFDU IUUQTHJUIVCDPNOPQQFGPYXPMG.FUBEBUB&YBNQMF ! !OPQQFGPYXPMG

Slide 38

Slide 38 text

·ͱΊ ‣ ϝλσʔλʹΞΫηε͢Δํ๏͸ෳ਺͋ΓҰ௕Ұ୹ Ͱ͋Δ ‣ ७4XJGUͳߏ଄ମͷ.FUBEBUBΛ҆શʹಘΔํ๏͸· ͩແ͍ɻ ‣ ϝϞϦΛࢀর͢ΔࣄͰɺ௨ৗऔಘग़དྷͳ͍ଟ͘ͷ৘ ใʹΞΫηεͰ͖Δ ! !OPQQFGPYXPMG