Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Swift <-> Kotlin
jsugai
November 24, 2017
0
170
Swift <-> Kotlin
jsugai
November 24, 2017
Tweet
Share
More Decks by jsugai
See All by jsugai
jsugai
0
250
jsugai
0
430
jsugai
0
47
jsugai
1
360
jsugai
1
290
jsugai
0
28
jsugai
1
270
Featured
See All Featured
paulrobertlloyd
72
1.4k
lara
172
9.6k
trishagee
23
2.5k
roundedbygravity
242
21k
carmenhchung
30
1.5k
ammeep
656
54k
tanoku
86
8.5k
jnunemaker
PRO
40
4.6k
maggiecrowley
9
490
paulrobertlloyd
71
3.6k
samanthasiow
56
6.3k
rasmusluckow
318
18k
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 ͷྑ͍ใΛ ڭ͍͑ͯͩ͘͞!