Upgrade to Pro — share decks privately, control downloads, hide ads and more …

K/NとNSKeyedArchiverと私

 K/NとNSKeyedArchiverと私

RyuNen344

March 16, 2023
Tweet

More Decks by RyuNen344

Other Decks in Programming

Transcript

  1. K/NͱNSKeyedArchiverͱࢲ
    2023.03.16 CA.aab #2
    RyuNen344/Bunjiro Miyoshi

    View Slide

  2. iOSͷ࿩͹͔ͬΓͰ


    ͝ΊΜͳ͍͞🙇
    ͸͡Ίʹ

    View Slide

  3. ຊ೔ͷΰʔϧ
    • Obj-CͷAPIΛK/NͰͪΌΜͱ࢖͑Δͱ͍͏͜ͱΛ஌ͬͯ΋Β͏(ͦ΋
    ͦ΋࢖͑Δ͜ͱ͸ᨳΘΕ͍ͯΔ͕)


    • K/NͰ࣮૷Ͱ͖Δ͜ͱΛ஌Δ͜ͱͰKMMಋೖ࣌ͷϋʔυϧ͸ࢥͬͨΑ
    Γߴ͘ͳ͍͜ͱΛ஌ͬͯ΋Β͏


    • androidΤϯδχΞ͕Obj-CͷK/NΛॻ͘ࡍʹԿΛϦϑΝϨϯεʹ͢Ε
    ͹͍͍ͷ͔Λ஌ͬͯ΋Β͏
    ϞόΠϧք۾ͰKMMಋೖ͕΋ͬͱਐΉʂ͏Ε͍͠ʂ

    View Slide

  4. ొ৔ਓ෺
    • K/N


    • NSKeyedArchiver


    • ࢲ

    View Slide

  5. ొ৔ਓ෺ɿK/N
    • Kotlin Nativeͷ͜ͱ


    • KotlinͰॻ͍ͨίʔυΛ֤ϓϥοτϑΥʔϜͰ࣮ߦՄೳͳωΠςΟϒ
    όΠφϦʹม׵࣮ͯ͠ߦͰ͖Δ࢓૊Έ


    • ͍ΖΜͳϓϥοτϑΥʔϜʹରԠ͍ͯ͠Δ


    • KMMͷiOSଆ͸͜Ε͕ಈ͍͍ͯΔ

    View Slide

  6. ొ৔ਓ෺ɿNSKeyedArchiver
    • Foundation.frameworkͷΫϥε


    • JavaͰ͍͏ͱ͜Ζͷserializableͳ΋ͷΛserialize, deserialize͢ΔΫϥ
    ε


    • Obj-C࣌୅ͰΑ͘ར༻͞Ε͍ͯͨ(Β͍͠ɺJsonपΓͷ࣮૷͕͍Βͳ͍
    ͔Β)

    View Slide

  7. • RyuNen344/Bunjiro Miyoshi


    • teamLab.Incॴଐ


    • ݏ͍ͳException͸InvalidMutabilityException


    • ޷͖ͳException͸IllegalStateException
    ొ৔ਓ෺ɿࢲ

    View Slide

  8. ຊ೔ͷରԠද
    J04 BOESPJE ͭ·Γʁ
    6TFS%FGBVMUT 4IBSFE1SFGFSFODFT YNM
    /4$PEJOH !4FSJBMJ[BCMF TFSJBMJ[FՄೳϚʔΧʔ
    /4,FZFE"SDIJWFS 0CKFDU0VUQVU4USFBN TFSJBMJ[F࣮ߦΫϥε
    /4,FZFE6OBSDIJWFS 0CKFDU*OQVU4USFBN EFTFSJBMJ[F࣮ߦΫϥε

    View Slide

  9. Ұ࣌తͳ৘ใอଘઌ
    • DBʹอଘ͢Δ·Ͱ΋ແ͍σʔλ


    • android


    • SharedPreferencesʹॻ͖ग़͢


    • ߏ଄ମ͸JsonStringͱͯ͠ॻ͖ࠐΉ(͜ͱ͕ࢲ͸ଟ͍Ͱ͢, GsonͱMoshi͞·͞·)


    • iOS


    • UserDefaultsʹॻ͖ग़͢


    • NSData, NSString, NSNumber, NSDate, NSArray, NSDictionaryͷ੍ݶ͋Γ


    • ߏ଄ମ͸NSDataͱͯ͠ॻ͖ࠐΉͷָ͕

    View Slide

  10. ߏ଄ମͷSerialize#kotlin

    View Slide

  11. ߏ଄ମͷSerialize#kotlin
    java.io.SerializableΛimplments͢Δ


    implement͢Δ͚ͩͰ
    fi
    eldΛserializeͯ͘͠ΕΔ

    View Slide

  12. ߏ଄ମͷSerialize#kotlin
    ObjectOutputStream#writeObjectΛ࣮ߦ͢Δ

    View Slide

  13. ߏ଄ମͷSerialize#Swift(Obj-C)

    View Slide

  14. ߏ଄ମͷSerialize#Swift(Obj-C)
    Swift to Obj-C૬ޓӡ༻ͷͨΊʹNSObjectΛܧঝ


    ΤϯίʔυՄೳʹ͢ΔͨΊʹNSCodingʹ४ڌ

    View Slide

  15. ߏ଄ମͷSerialize#Swift(Obj-C)
    encode, decode࣌ͷ࣮ڍಈΛ࣮૷

    View Slide

  16. ߏ଄ମͷSerialize#Swift(Obj-C)

    View Slide

  17. ߏ଄ମͷSerialize#Swift(Obj-C)
    Ͳ͏͍͏Classͷߏ੒ͳͷ͔(Meta৘ใ)Λ


    NSKeyedˎˎʹڭ͑ࠐΉ

    View Slide

  18. ߏ଄ମͷSerialize#Swift(Obj-C)
    unarchive͢Δͱ͖ʹ͸ର৅ͷΫϥε͕΋͍ͬͯΔ


    ม਺ͷܕ৘ใ΋౉ͯ͋͛͠Δ

    View Slide

  19. ߏ଄ମͷSerialize#Swift(Obj-C) to K/N
    ❓. NSData(Data)͕K/NͩͱԿ͔Λ஌Δ


    ❓. NSCoding protocolʹ४ڌͨ͠classΛ࡞Γํ


    ❓. NSKeyed**ʹڭ͑ࠐΉΫϥεͷࢦఆͷ࢓ํ

    View Slide

  20. NSData(Data)#K/N
    • Kotlin.StringͱObj-C.NSString͸K/NଆͰޓ׵͕୲อ͞Ε͍ͯΔ


    • NSString#dataUsingEncoding(encoding)Λ࢖༻ͯ͠ม׵͢Δ

    View Slide

  21. Class implements NSCoding#K/N
    [email protected]͸Kotlin.interfaceʹޓ׵

    View Slide

  22. Class implements NSCoding#K/N
    [email protected]͸Kotlin.interfaceʹޓ׵
    Unresolved Reference😂

    View Slide

  23. Class implements NSCoding#K/N
    Μʁ🤔

    View Slide

  24. Class implements NSCoding#K/N

    View Slide

  25. Class implements NSCoding#K/N
    Obj-Cͷprotocol໊ͱඍົʹҧ͏ͷͰ஫ҙ͢Δ


    protocolΛ࣮૷͢Δࡍ͸NSObjectΛܧঝ͢Δ(͠ͳ
    ͍ͱϏϧυ௨Βͳ͍ʣ

    View Slide

  26. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N
    • ͦ΋ͦ΋NSKeyed**ʹڭ͑ࠐΉΫϥεͱ͸ͳΜͳͷ͔Λ͠Γ͍ͨ


    A. →ެࣜΛࢀর͢Δ


    • https://developer.apple.com/documentation/foundation/
    nskeyedarchiver


    • https://developer.apple.com/documentation/foundation/
    nskeyedunarchiver

    View Slide

  27. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N

    View Slide

  28. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N
    android developer͕kotlinͱjavaΛ੾Γସ͑ΒΕΔΑ͏ʹ


    swiftͱObj-CΛ੾Γସ͑ΒΕΔ


    K/N͸Obj-Cޓ׵ͳͷͰObj-CͷDocΛݟΔඞཁ͕͋Δ

    View Slide

  29. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N

    View Slide

  30. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N
    AnyClass(swift)͡Όͳͯ͘Class(Obj-C)Λ౉͢ඞཁ͕͋Δ

    View Slide

  31. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N
    • swiftͱkotlin͸ࣅ͍ͯΔ(ݸਓͷײ૝)ͷͰswiftΛࢀߟʹίʔυΛॻ͘
    ·ͨUnresolved Reference😂

    View Slide

  32. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N

    View Slide

  33. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N
    • Apple Developerʹ͸NSObjectʹੜ͍͑ͯΔϝιουͱ͋Δ͕
    Book.classForKeyedUnarchiver()Ͱݟ͔ͭΒͳ͍ɾɾɾɾɾɾ


    • Book.classForKeyedUnarchiver()Ͱݺͼग़ͤΔΑ͏ʹ͍͔ͨ͠Βɺ
    companion objectΛͳʹ͔͢Δඞཁ͕͋Γͦ͏ɾɾɾɾɾɾ

    View Slide

  34. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N
    Μʁ🤔

    View Slide

  35. NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N
    ݺ΂ΔΑ͏ʹͳͬͨ😃


    ͋ͱ͸Unarchive͢Δ͚ͩ

    View Slide

  36. ·ͱΊ
    • protocol͸K/N্ͩͱ**Protocolͱ͍͏interfaceʹͳͬͯͨΓ͢Δ


    • Type Method͸K/N্ͩͱ**Meta classʹੜ͍͑ͯͨΓ͢Δ


    • SwiftͱObj-CͰAPI͕ҧ͏ͷͰެࣜDoc͸Obj-CͷΛࢀর͢Δ


    • Obj-CͷAPI͕K/N্ͩͱͲͷΑ͏ͳఆٛʹͳ͍ͬͯΔ͔͸IDE্Ͱδϟϯϓͯ֬͠
    ೝͰ͖ΔɺJetBrainsΛ৴͡Ζʂʂ


    • archive, unarchive͢Δίʔυ͸ࢀরͷϦϙδτϦʹࡌͤͯΔͷͰͦ͜ͰΈͯͩ͘
    ͍͞

    View Slide

  37. ͜ΕͰKMM͕ḿΓ·͢Ͷ😉

    View Slide

  38. ࢀߟࢿྉ
    • RyuNen344/KNKeyedArchiver


    • https://github.com/RyuNen344/KNKeyedArchiver


    • native-objc-interop


    • https://kotlinlang.org/docs/native-objc-interop.html#mappings


    • NSObject


    • https://developer.apple.com/documentation/objectivec/nsobject?
    language=objc

    View Slide