Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Swift <-> Kotlin
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
jsugai
November 24, 2017
490
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
410
SOUZOUxMERCARI-A Story of Cute Birds and Oldman
jsugai
0
670
Prepare for Android 8.0/GDG-Kobe 2017-09-18
jsugai
0
83
Hashtag
jsugai
1
630
Layout ファイルののメンテナンス
jsugai
1
530
Ho Chi Minh.apk
jsugai
0
53
Umeda.apk 報告会資料
jsugai
1
570
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
Design in an AI World
tapps
1
320
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Test your architecture with Archunit
thirion
2
2.4k
Skip the Path - Find Your Career Trail
mkilby
1
230
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Fireside Chat
paigeccino
43
4k
WENDY [Excerpt]
tessaabrams
14
39k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
690
A better future with KSS
kneath
240
18k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
How to Talk to Developers About Accessibility
jct
2
550
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 ͷྑ͍ใΛ ڭ͍͑ͯͩ͘͞!