KMM — Kotlin inside Swift

Jemo Mgebrishvili
TBC Engineering
3 min readJun 7, 2022

--

გამარჯობა 🙌

მინდა მოგიყვეთ ორი ბრწყინვალე ენის Swift ის და Kotlin ის გადაკვეთაზე.

იქამდე კი სანამ დავიწყებდე ამ სტატიის სათაურის თემაზე საუბარს, მცირედი ინფორმაცია მინდა გითხრათ KMM ზე.

KMM -- Kotlin Multiplatform Mobile.
Jetbrains ის პროდუქტია რომელიც KMP ოჯახის წევრია.

KMP ? 👀 Kotlin Multiplatform Project ეს არის პროდუქტი, რომლიც საშუალებას გვაძლევს დავწეროთ აპლიკაციები შემდეგი პლატფორმებისთვის → MacOS, Windows, Linux, Web(javascript).

Thats it :) Super ❤️

KMM კი არის დათარგეთებული (დაკონფიგურირებული) iOS და Android პლატფორმებისთვის, შესაბამისად საშუალებას გვაძლევს შევქმნათ მულტიპლაფრომული (Not Crossplatform) აპლიკაციები iOS & Android ისთვის.

მთავარი განსხვავება ქროს პლატფორმულ მიდგომასთან არის ის რომ KMM ში ვწერთ მხოლოდ Non UI კოდს, სხვა დანარჩენი კი შეგვიძლია დავწეროთ კოტლინზე (Netwroking, Database, Caching, Analytics და ა.შ.).

UI _ს ნაწილი რჩება უცვლელად, საბოლოოდ გენერირებული binary რაც იმპორტდება როგორც ***.framework ბიბლიოთეკა iOS ის პროექტში არის ნეიტივი ამ პლატფორმისთვის 💪.
ანდროიდის შემთხვაში ყველაფერი ისეა როგორც ძველად 🙌.

ბონუსად კი გვაქვს ბიზნეს ლოგიკის ერთი codebase, Android Studio & Xcode კომფორტული დეველოპმენტისთვის.

რაც შეეხება Unit ტესტებს, აქაც გვაქვს ტესტი რომელიც იწერება ერთი და ფარავს ორივე პლატფორმას. ✌️

არსებული პროექტების მიგრაციაც შედარებით უმტკივნეულოდ შეიძლება მოხდეს (depends on project codebase) ვინაიდან KMM ზე მხოლოდ ბიზნეს ლოგიკას ვწერთ, მარტივად შეიძლება domain & data layer ის გატანა shared მოდულში

როდესაც Android Studio დან ვქმნით KMM პროექტს, გენერირდება პროექტი ასეთი სტრუქტურით

androidApp - სტანდარტული ანდროიდ პროექტის მოდული.
iosApp - სტანდარტული iOS ის პროექტი (რაღა თქმა უნდა შესაძლებელია უკვე არსებული iOS პროექტის გამოყენება, რომელიც იქნება ცალკე რეპოზიტორიში)

რაც შეეხება shared მოდულს, აქ გენერირდება სამი ქვე მოდული

დავიწყოთ commonMain მოდულით:

ესაა სწორედ ის ადგილი სადაც ვწერთ კოდს რომელიც საერთო იქნება iOS და Android პლატფორმებისთვის.

commonMain იზოლირებულია ყველა პლატფორმისგან, ეს ნიშნავს იმას რომ ჩვენ არ შეგვიძლია დავწეროთ ისეთი კოდი რომელიც რომელიმე პლატფორმასთანაა დაკავშირებული, მაგ: Context, Intent, java.util.*, File, Bitmap, Base64 და ა.შ.

კითხვა — რა ხდება მაშინ როცა გვინდა გვქონდეს საერთო (shared) კოდი, რომელსაც დაჭირდება პლატფორმულ კოდთან მუშაობა?

მაგალითად: დაამუშავებს ფაილებს (შექმნის, დაქეშავს და ა.შ.)
ამ დროს საქმეში შემოდის androidMain და iosMain მოდულები, სწორედ ამ მოდულებში გვაქვს წვდომა პლატფორმულ ფიჩერებთან.

განვიხილოთ ფაილების მაგალითი.
გვინდა რომ გვქონდეს საშუალება iOS და Android ზე რომ ფაილებს ვემუშაოთ ერთი codebase ით

ეხლა ვნახოთ რა მოხდა ზემოთ ↑.
commonMain ში შევქმენით კლასი expect ქივორდით და როგორც ვთქვით commonMain იზოლირებულია პლატროფმებისგან, ხოლო ფაილურ სისტემასთან სამუშაოდ ანდროდში (JVM ში) გვჭირდება java.util.* ფექიჯი(პაკეტი) ხოლო iOS ში Foundation, ამიტომაც ამ კლასში მეთოდების იმპლემნტაცია არ მოხდება

commonMain ს წარმოდგენა არ აქვს ამ ფექიჯების არსებობის შესახებ.

იმპლემნტაცია ხდება androidMain სა და iosMain ში actual ქივორდით. აუცილებელია რომ ამ კლასებს რომლებიც იმპლემენტაციას აკეთებენ ფექიჯი და კლასის სახელიც იგივე ქონდეთ.

Nice fact: Android Studio დან შეგიძლიათ დასტარტოთ და გაუშვათ აპლიკაცია iOS სიმულატორზე.
სიმულატორზე გაშვებული აპლიკაციის დებაგინგიც კი შეგიძლიათ.

Kotlin inside Swift as I promised 😉

ვნახოთ როგორ გამოვიყენებდით FileUtils კოტლინის კლასს swift ის პროექტში:

ისეთი core ფიჩერებისთვის როგორიცაა networking, database, dependency injection, multithreading და სხვა, უკვე არსებობს ბრწყინვალე ბიბლიოთეკები როგორიცაა Ktor, SQLDelight, Koin, Coroutines და ა.შ. რომლებიც მარტივად შეგვიძლია shared მოდულის დეფედენსებში ჩავიმატოთ.

მუშაობის პრაქტიკები გუნდებში:

Variant #1
Mobile backend team: რომელიც იმუშავებს shared მოდულზე
Front team: iOS & Android.

Variant #2
Cross team: iOS & Android დეველოპერები მუშაობენ ერთად. ამ შემთხვევაში საჭირო იქნება, რომ ორივე პლატროფმის დეველოპერს ქონდეს ცოდის ბაზა (არაა აუცილებელი იყო ექსპერტი) ერთმანეთის პლატფორმებზე.

ამ მიდგომით, პირველ ეტაპზე საჭიროა რომ ანდროიდებმა, iOS ებს გააცნონ თუ what the heck is gradle. 🙈

Variant #3
Android fullstack team: მუშაობს core მოდულზეც და UI ზეც
iOS dev team: მუშაობს front ის ნაწილზე.

სამივე ვარიანტში, რათქმაუნდა საჭიროა iOS და Android დეველოპერების ერთმანეთთან კომუნიკაცია/დახმარება, პლატფორმულ ნაწილებთან სამუშაოდ, შეთანხმება თუ რა სახის API უნდა ქონდეს shared მოდულს და ა.შ.

შემდეგ პოსტში მოგიყვებით ამ სტატის სათაურის (Kotlin inside Swift) შებრუნებულ ვარიანტზე → Swift inside Kotlin. 😊

That’s it.
Thanks ❤

--

--