K/NͱNSKeyedArchiverͱࢲ2023.03.16 CA.aab #2RyuNen344/Bunjiro Miyoshi
View Slide
iOSͷ͔ͬΓͰ͝ΊΜͳ͍͞🙇͡Ίʹ
ຊͷΰʔϧ• Obj-CͷAPIΛK/NͰͪΌΜͱ͑Δͱ͍͏͜ͱΛͬͯΒ͏(ͦͦ͑Δ͜ͱᨳΘΕ͍ͯΔ͕)• K/NͰ࣮Ͱ͖Δ͜ͱΛΔ͜ͱͰKMMಋೖ࣌ͷϋʔυϧࢥͬͨΑΓߴ͘ͳ͍͜ͱΛͬͯΒ͏• androidΤϯδχΞ͕Obj-CͷK/NΛॻ͘ࡍʹԿΛϦϑΝϨϯεʹ͢Ε͍͍ͷ͔ΛͬͯΒ͏ϞόΠϧք۾ͰKMMಋೖ͕ͬͱਐΉʂ͏Ε͍͠ʂ
ొਓ• K/N• NSKeyedArchiver• ࢲ
ొਓɿK/N• Kotlin Nativeͷ͜ͱ• KotlinͰॻ͍ͨίʔυΛ֤ϓϥοτϑΥʔϜͰ࣮ߦՄೳͳωΠςΟϒόΠφϦʹม࣮ͯ͠ߦͰ͖ΔΈ• ͍ΖΜͳϓϥοτϑΥʔϜʹରԠ͍ͯ͠Δ• KMMͷiOSଆ͜Ε͕ಈ͍͍ͯΔ
ొਓɿNSKeyedArchiver• Foundation.frameworkͷΫϥε• JavaͰ͍͏ͱ͜ΖͷserializableͳͷΛserialize, deserialize͢ΔΫϥε• Obj-C࣌ͰΑ͘ར༻͞Ε͍ͯͨ(Β͍͠ɺJsonपΓͷ࣮͕͍Βͳ͍͔Β)
• RyuNen344/Bunjiro Miyoshi• teamLab.Incॴଐ• ݏ͍ͳExceptionInvalidMutabilityException• ͖ͳExceptionIllegalStateExceptionొਓɿࢲ
ຊͷରԠදJ04 BOESPJE ͭ·Γʁ6TFS%FGBVMUT 4IBSFE1SFGFSFODFT YNM/4$PEJOH !4FSJBMJ[BCMF TFSJBMJ[FՄೳϚʔΧʔ/4,FZFE"SDIJWFS 0CKFDU0VUQVU4USFBN TFSJBMJ[F࣮ߦΫϥε/4,FZFE6OBSDIJWFS 0CKFDU*OQVU4USFBN EFTFSJBMJ[F࣮ߦΫϥε
Ұ࣌తͳใอଘઌ• DBʹอଘ͢Δ·Ͱແ͍σʔλ• android• SharedPreferencesʹॻ͖ग़͢• ߏମJsonStringͱͯ͠ॻ͖ࠐΉ(͜ͱ͕ࢲଟ͍Ͱ͢, GsonͱMoshi͞·͞·)• iOS• UserDefaultsʹॻ͖ग़͢• NSData, NSString, NSNumber, NSDate, NSArray, NSDictionaryͷ੍ݶ͋Γ• ߏମNSDataͱͯ͠ॻ͖ࠐΉͷָ͕
ߏମͷSerialize#kotlin
ߏମͷSerialize#kotlinjava.io.SerializableΛimplments͢Δimplement͢Δ͚ͩͰfieldΛserializeͯ͘͠ΕΔ
ߏମͷSerialize#kotlinObjectOutputStream#writeObjectΛ࣮ߦ͢Δ
ߏମͷSerialize#Swift(Obj-C)
ߏମͷSerialize#Swift(Obj-C)Swift to Obj-C૬ޓӡ༻ͷͨΊʹNSObjectΛܧঝΤϯίʔυՄೳʹ͢ΔͨΊʹNSCodingʹ४ڌ
ߏମͷSerialize#Swift(Obj-C)encode, decode࣌ͷ࣮ڍಈΛ࣮
ߏମͷSerialize#Swift(Obj-C)Ͳ͏͍͏Classͷߏͳͷ͔(Metaใ)ΛNSKeyedˎˎʹڭ͑ࠐΉ
ߏମͷSerialize#Swift(Obj-C)unarchive͢Δͱ͖ʹରͷΫϥε͕͍ͬͯΔมͷܕใͯ͋͛͠Δ
ߏମͷSerialize#Swift(Obj-C) to K/N❓. NSData(Data)͕K/NͩͱԿ͔ΛΔ❓. NSCoding protocolʹ४ڌͨ͠classΛ࡞Γํ❓. NSKeyed**ʹڭ͑ࠐΉΫϥεͷࢦఆͷํ
NSData(Data)#K/N• Kotlin.StringͱObj-C.NSStringK/NଆͰޓ͕୲อ͞Ε͍ͯΔ• NSString#dataUsingEncoding(encoding)Λ༻ͯ͠ม͢Δ
Class implements NSCoding#K/N• [email protected]Kotlin.interfaceʹޓ
Class implements NSCoding#K/N• [email protected]Kotlin.interfaceʹޓUnresolved Reference😂
Class implements NSCoding#K/NΜʁ🤔
Class implements NSCoding#K/N
Class implements NSCoding#K/NObj-Cͷprotocol໊ͱඍົʹҧ͏ͷͰҙ͢ΔprotocolΛ࣮͢ΔࡍNSObjectΛܧঝ͢Δ(͠ͳ͍ͱϏϧυ௨Βͳ͍ʣ
NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N• ͦͦNSKeyed**ʹڭ͑ࠐΉΫϥεͱͳΜͳͷ͔Λ͠Γ͍ͨA. →ެࣜΛࢀর͢Δ• https://developer.apple.com/documentation/foundation/nskeyedarchiver• https://developer.apple.com/documentation/foundation/nskeyedunarchiver
NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N
NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/Nandroid developer͕kotlinͱjavaΛΓସ͑ΒΕΔΑ͏ʹswiftͱObj-CΛΓସ͑ΒΕΔK/NObj-CޓͳͷͰObj-CͷDocΛݟΔඞཁ͕͋Δ
NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/NAnyClass(swift)͡Όͳͯ͘Class(Obj-C)Λ͢ඞཁ͕͋Δ
NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N• swiftͱkotlinࣅ͍ͯΔ(ݸਓͷײ)ͷͰswiftΛࢀߟʹίʔυΛॻ͘·ͨUnresolved Reference😂
NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/N• Apple DeveloperʹNSObjectʹੜ͍͑ͯΔϝιουͱ͋Δ͕Book.classForKeyedUnarchiver()Ͱݟ͔ͭΒͳ͍ɾɾɾɾɾɾ• Book.classForKeyedUnarchiver()Ͱݺͼग़ͤΔΑ͏ʹ͍͔ͨ͠Βɺcompanion objectΛͳʹ͔͢Δඞཁ͕͋Γͦ͏ɾɾɾɾɾɾ
NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/NΜʁ🤔
NSKeyed**ʹKotlinΛΘ͔ΒͤΔ#K/NݺΔΑ͏ʹͳͬͨ😃͋ͱUnarchive͢Δ͚ͩ
·ͱΊ• protocolK/N্ͩͱ**Protocolͱ͍͏interfaceʹͳͬͯͨΓ͢Δ• Type MethodK/N্ͩͱ**Meta classʹੜ͍͑ͯͨΓ͢Δ• SwiftͱObj-CͰAPI͕ҧ͏ͷͰެࣜDocObj-CͷΛࢀর͢Δ• Obj-CͷAPI͕K/N্ͩͱͲͷΑ͏ͳఆٛʹͳ͍ͬͯΔ͔IDE্Ͱδϟϯϓͯ֬͠ೝͰ͖ΔɺJetBrainsΛ৴͡Ζʂʂ• archive, unarchive͢ΔίʔυࢀরͷϦϙδτϦʹࡌͤͯΔͷͰͦ͜ͰΈ͍ͯͩ͘͞
͜ΕͰKMM͕ḿΓ·͢Ͷ😉
ࢀߟࢿྉ• 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