Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Swift <-> Kotlin
Search
jsugai
November 24, 2017
480
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Swift <-> Kotlin
jsugai
November 24, 2017
More Decks by jsugai
See All by jsugai
OsakaMixLeap #11 LT "Star Trek" and "Software development" are similar
jsugai
0
400
SOUZOUxMERCARI-A Story of Cute Birds and Oldman
jsugai
0
660
Prepare for Android 8.0/GDG-Kobe 2017-09-18
jsugai
0
80
Hashtag
jsugai
1
620
Layout ファイルののメンテナンス
jsugai
1
530
Ho Chi Minh.apk
jsugai
0
52
Umeda.apk 報告会資料
jsugai
1
560
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
46
8.2k
30 Presentation Tips
portentint
PRO
1
340
Practical Orchestrator
shlominoach
191
11k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
250
Navigating Team Friction
lara
192
16k
The agentic SEO stack - context over prompts
schlessera
0
840
Bash Introduction
62gerente
615
220k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Evolving SEO for Evolving Search Engines
ryanjones
0
230
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
210
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
170
Transcript
Swift Kotlin Mercari, Inc 㱺 㱺
About me Jun Sugai @calciolife Mercari
Calcio? • ΠλϦΞޠͰαοΧʔͷ͜ͱ • 00͝Ζ͔ΒAC Millan ͷϑΝϯ • ηϦΤA Ϯν
൵ใ • ΠλϦΞද 60ͿΓ ʹ World Cup ग़Λಀ͢ • WC༧બഊୀ
• ਖ਼ɺɺํͳ͍ɻબख͕... >
Agenda • KotlinͱSwiftΛோΊͳ͕Βࢥ͏ • Swift Ͱײ͡Δָ͠Έํ ˞ iOSͷ͠·ͤΜ
ຊ Swift ॳֶͷΤϯδχΞ ͱͯ͠͠·͢ ຐङͳ͍͛ͯͩ͘͞
Γ͍ͨ Ͳ͏ͬͨΒ։ൃܥͷใΛݟ͚ͭΒΕΔͷ͔? •ॳֶ͔Βগͯ͘͠͠Δͱײ͡ΔṖͷয૩ײ StoryBoard ͷ༗ແཧํ๏, Segue View पΓͳͲ ઃܭͷࠜװʹؔΘΓͦ͏ͳͱ͜Ζɺௐͯ݁ہओྲྀ͕͔Βͳ͍
•ʹͭ͘ͷଟ͘શ෦ Swift Ͱͳ͘ iOS ͕ݪҼ Swift ͷίϯύΠϧ͙࣌ؒΒ͍ʁʢίϯύΠϥͷख़ʣ iOS ͷۀΛഎෛ͏͔͠ͳ͍ʁ
Swift ͷྑͦ͞͏ͩͱࢥͬͨॴ • શମతʹ্͔ΒԼʹॲཧΛΩϨΠʹهड़͕Ͱ͖ΔΑ͏ ͳΈֻ͚͕ॆ࣮ͯ͠Δ(Α͏ʹײ͡Δɻ͚ࣗͩ?) • ඪ४ͳ੍ޚߏจҎ֎Ͱ nil/null ͰຒΊࠐΈͦ͏ͳཕ Λɺݴޠ༷ͷํͰճආ͢Δज़͕ଟ͍
• ਖ਼ willset/didset িܸΛड͚ͨ ݟͯΔଆͩͱɺત·ͯ͘͠ࢮʹͦ͏ ͏ଆʹͳΔͱɺ͍Ͳ͜Ζ͕ͯ͘͠ࢮʹͦ͏
͕ٙ͋Δ ͕ࣗ Swift ͷੌ͘ྑ͍ͱײ͡Δ͜ͱ͕ɺ͋·Γ๙ΊΒ Ε͍ͯͳ͍Α͏ʹࢥ͏ Optional ͔ͨ͠ʹૉΒ͍͚͠Ͳ Optional ΛɺͲ͏ ͍͏ΞΠσΞͰ࣮ݱ͍ͯ͠Δ͔ͷ΄͏͕ؾʹͳΔ
ԆධՁͷΈͲ͏ͳͬͯΔͷʁͱ͔ɻ
KotlinͰ͍͠ Swiftͷָ͠Έํ
ָ͠Έ 1. ݴޠ༷͔ΒಡΈऔΔઓུ 2. ݴޠ༷͔Βໝ͢Δڍಈ 3. Swift Evolution ͔Βۭ͢Δະདྷ૾ ࠓओʹ͢༰
͍͔͍ͭͨ͠༰
Kotlin Bytecode ܦ༝ͳͷͰໝ͕͔ͲΒͳ͍
Swift ҹ ɾධՁઓུ ɾࢀরͱ ɾΫϥεͱϝιου
ධՁઓུ •աͳ֦ுੑͷ੍ •Optional ࡞༻తॱংͷൣғͰఏڙ͞ΕΔ ݴޠ༷͔Β෦ධՁΛআͨ͠ͷӳஅ •֦ுੑʹର͢Δҹʮ༷ΛίϯύΫτʹ ͢Δ͜ͱͰݎ࿚ੑΛ૿͢ʯ άϩʔόϧมͷ࣮ͱ͔
ʘ ?P? ʗ
ධՁઓུ:άϩʔόϧม v_localOne = F_globalVar(); https://railsware.com/blog/2014/06/11/global-variables-in-swift-are-not-variables/ @HMPCBMJOJU@GVOD SwiftͰͷάϩʔόϧมλΠϓίϯςΩετͷ֎ଆʹஔ͞ΕΔɻʢͱυΩϡϝϯτʹॻ͍ͯ͋Δʣ C lang తʹߟ͑ΔͳΒ
longjmp ͢ΔͱϨδελΛॻ͖͑ͨ߹ʹϩʔΧϧมείʔϓͷר͖͕͠ อূ͞ΕΔ(auto) ͕άϩʔόϧมר͖͞Εͳ͍ʹະఆٛͷͱͳΔ࣮͕ଟ͍ɻ Thread Context Λ Switch ͢Δͨͼʹ Global มͷר͖͠Λߦ͏ʹɺ෭࡞༻Λ͏͜ͱ͕ଟ͘SwiftͰάϩʔόϧ มͷॳظԽΛؔݺͼग़͠ʹஔ͖͑Δ͜ͱͰ setjmp/longjmp Ͱͷ࣮ߦίʔυΛύλʔϯԽͯ͠࠷దԽޮΛߴΊͯ ͍Δʁ https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-XID_382 ಡ·ͳͯ͘0,
ධՁઓུ:accessor Swift ͷΞΫηαಛघͳػೳ(mutating ͱ͔) Subscripts ίϯύΠϧ(ߏจղੳʣͰదʹ ॲཧ͞ΕΔ ͞Ε͍ͯͨ ASTߏจղੳͷ్தͰॲཧ͕ଘࡏ͢Δ
Parse ͷ createSetterAccessorArgument Ͱߦ͍ͬͯΔ EJETFUXJMMTFU
ධՁઓུ: •ΞΫηαࣝผࢠ(Identifire)ʹରͯ͠༩͞ΕΔ •ࣝผࢠ(Identifire)ͱࢀরΛஅ͢ΔͨΊͷ໊લ • didset/willset mutating ͳͲͱಉ͡λΠϛϯάͰίϯύΠϥ ͕ϝιουΛੜ͢Δʢ෦తʹϝιουΛੜ͢Δʣ •
มͷΞΫηαϒϩοΫ OBNFTQBDF\ TUSVDU"DDFTTPST\ 4UPSBHF,JOE,JOE 'VOD%FDM (FUOVMMQUS 4FUOVMMQUS .BUFSJBMJ[F'PS4FUOVMMQUS 'VOD%FDM "EESFTTOVMMQUS .VUBCMF"EESFTTOVMMQUS 'VOD%FDM 8JMM4FUOVMMQUS %JE4FUOVMMQUS ^ ^FOEBOPOZNPVTOBNFTQBDF
ධՁઓུ: •ϓϩτίϧʹΑΔΫϥεͷ֦ுґଘ/ܧঝؔͷෳࡶ͞Λ ݮͤ͞Δ •·ͨ҆શͳࢀরΛอޢ͢ΔͨΊͷ໋ྩؒॱংͷॏෳΛ͗ݺ ͼग़͠ઌͷಛఆ͕༰қ •ϝιουΛల։͢ΔύΠϓϥΠϯίϯύΠϧ࣌ͷ࠷దԽର ʹ͓͚ΔॏཁͳϙΠϯτ Statement Cold
Block ͱ͠ɺΈࠐΈͳͲݸผͷ࠷దԽύΠϓϥΠϯͰॲཧ͍ͯ͠Δ Optimize Desine Swift/Doc/OptimizedDesign.md ʹઆ໌͕͋Δ
ʘ ?P? ʗ
ಛʹݴޠ༷తͳҧ͍͔Βށ͏Օॴ ɾϓϩύςΟपΓ(willset/didset) ɾSwift ͷ guard ͍͍ͬ͢Ͷ! ɾUIKit ਏ͍
྆ํΛ෮ԣͼ͠ͳ͕Βࢥ͏͜ͱ
willset/didset
ށ͏͜ͱ Property Λॻ͖͑Δલ/ޙͰݺΕΔࢹػೳ ... var age: Int = 0 {
willSet { // <- age ʹΛೖ͢Δ࣌ʹݺΕΔ println("age willSet:\(age) -> \(newValue)") } didSet { // <- age ʹ͕ೖ͞ΕͨޙʹݺΕΔ println("age didSet :\(oldValue) -> \(age)") } } ... ศར͕ͩ Kotlin Ͱ... custom setter/getter ͋ͨΓ͕མͱ͠ॴ? ͨͩ Kotlin Ͱؤுͬͯදݱ͔ͨ͠Βͱݴͬͯར༻͕ߴ͍ͱࢥ͑ͳ͍ɻ ͜͏͍͏ͷݴޠ༷Ͱදݱ͞ΕΔͱ࠷ߴͳػೳͷදɻ ͨͩɺਖ਼͍ͬͯϕετϓϥΫςΟε͕͔Βͳͯ͘ɺͬͯͳ͍/͑ͯͳ͍.... ϕετϓϥΫςΟε୭͔ڭ͑ͯɻҒ͍ਓɻΤϩ͍ਓʂ
swift : guard statement
func hoge() { guard let name = nameField.text else
{ return } guard let addr = addrField.text else { return } sendLog(LOG_TYPE_FIELD, name, addr) ... }
to Kotlin
func hoge() { val name = nameField?.text ?:return val
addr = addrField?.text ?:return sendLog(LOG_TYPE_FIELD, name, addr) ... }
͕͔ͩ͠͠ɻବ՛ࢠ՛ࢠɻ Kotlin ͷ Elvis Operator ϩʔΧϧ είʔϓͷϒϩοΫΛ࡞Βͳ͍ͷͰ ૣظ return Ҏ֎ͷॲཧ͕ඞཁͩͱ...
func hoge() { guard let name = nameField.text else
{ showMessage("please input name field") // local scope Λͭ͘ΕΔ͔Β return ͷલʹॲཧok! return } ... } func hoge() { if( nameField?.text == null ) { // ݹయతͳํ๏ showMessage("please input name field") return } ... }
Kotlin Ͱ Swift Έͨ͘ॻ͖͍ͨ!
private inline fun <T> T?.checkNull(ifNull: ()-> T ): T =
this ?: ifNull() func hoge() { nameField?.text.checkNull { showMessage("please input name field") return } ... }
None
Swift ͷྑ͍ใΛ ڭ͍͑ͯͩ͘͞!