Slide 1

Slide 1 text

༗ཧ਺Ϋϥεͷ͢͢Ί 2017/08/08 Swift/Kotlin߹ಉษڧձ @ΦΠγοΫευοτେ஍גࣜձࣾ Koishi 1 Koichiro Oishi, 2017/08/08

Slide 2

Slide 2 text

ࣗݾ঺հ େੴ ߂Ұ࿠ γεςϜɾΞφϥΠζגࣜձࣾ iOSΞϓϦ։ൃऀ ΞΧ΢ϯτؔ࿈ * @mego_ * koishi 2 Koichiro Oishi, 2017/08/08

Slide 3

Slide 3 text

ίϯςΩετ iOSΞϓϦΤϯδχΞͰ͢ɻ Objective-CͱSwift͸஌ࣝ͸͋Δ(͋Δఔ౓) JavaͳΜͱͳ͘஌ͬͯΔɻ Kotlin͸ೖ໳த ! 3 Koichiro Oishi, 2017/08/08

Slide 4

Slide 4 text

ࢀߟจݙ Swift ࣮ફೖ໳ ※ஶऀͷ1ਓɺੴ઒͞Μ͔Βα Πϯ΋Β͍·ͨ͠ɻ 4 Koichiro Oishi, 2017/08/08

Slide 5

Slide 5 text

ࢀߟจݙ Kotlin ελʔτϒοΫ ௨শʮ੺΂͜ຊʯ ※ஶऀͷͨΖ͏͞Μ͔ΒαΠϯ ΋Β͍·ͨ͠ɻ 5 Koichiro Oishi, 2017/08/08

Slide 6

Slide 6 text

͓୊ ༗ཧ਺Ϋϥεͷ࣮૷ 6 Koichiro Oishi, 2017/08/08

Slide 7

Slide 7 text

ݩωλ ʮKotlin ελʔτϒοΫʯ • p.27ʙp.40 • ୈ3ষ KotlinΨΠυπΞʔ • KotlinͷεϚʔτͳݴޠ࢓༷͕೺ѲͰ͖Δ಺༰ 7 Koichiro Oishi, 2017/08/08

Slide 8

Slide 8 text

ݩʑͷग़య͸ Scala εέʔϥϒϧ ϓϩάϥϛϯά • ௨শίοϓຊ 8 Koichiro Oishi, 2017/08/08

Slide 9

Slide 9 text

༗ཧ਺Ϋϥε • ༗ཧ਺ͱ͸෼ࢠ(numerator)ͱ෼฼(denominator)Ͱ දݱ͢Δ਺஋ • ༗ཧ਺(෼਺)Λදݱ͢ΔΫϥεRationalͷ࣮૷ ͦΕͰ͸ߦͬͯΈ·͠ΐ͏ʂ 9 Koichiro Oishi, 2017/08/08

Slide 10

Slide 10 text

Ϋϥεͷఆٛ(Kotlin) ෼ࢠͱ෼฼ΛϓϩύςΟͱͯ࣋ͭ͠ΫϥεRational Λఆٛ͢Δ class Rational(val numerator: Int, val denominator: Int) • numeratorͱdenominator͸͜Ε͚ͩͰϓϩύςΟ ʹͳΔɻ • ͪͳΈʹval͸ఆ਺ɺvar͸ม਺ 10 Koichiro Oishi, 2017/08/08

Slide 11

Slide 11 text

Ϋϥεͷఆٛ(Swift) struct Rational { let numerator: Int let denominator: Int } let rational = Rational(numerator: 1, denominator: 2) • ϓϩύςΟΛఆٛ͢Ε͹ΠχγϟϥΠβͷҾ਺ͱ ͯͦ͠ͷ··࢖͑Δ • ͪͳΈʹlet͸ఆ਺ɺvar͸ม਺ 11 Koichiro Oishi, 2017/08/08

Slide 12

Slide 12 text

ϝιουͷఆٛ(Kotlin) print(rational)ͨ͠ࡍʹ஋ͷදࣔΛͰ͖ΔΑ͏ʹ͢Δ Rational@279f2327 Ͱ͸ͳ͘ 1/2 ͳͲͱ͍ͨ͠ class Rational(val numerator: Int, val denominator: Int) { override fun toString(): String = "${numerator}/${denominator}" } • toString()ΛΦʔόϥΠυ͢Δ 12 Koichiro Oishi, 2017/08/08

Slide 13

Slide 13 text

ϝιουͷఆٛ(Swift) extension Rational: CustomStringConvertible { var description: String { return "\(numerator)/\(denominator)" } } • CustomStringConvertibleϓϩτίϧʹ४ڌͨ͠ extensionͰdescriptionϓϩύςΟΛ࣮૷ 13 Koichiro Oishi, 2017/08/08

Slide 14

Slide 14 text

ΠχγϟϥΠβ(Kotlin) ෼฼ʹ0͕୅ೖ͞Εͨ৔߹͸Τϥʔͱ͢ΔͨΊΠχ γϟϥΠβͰ࣮૷͢Δ class Rational(val numerator: Int, val denominator: Int) { init { require(denominator != 0, {"denominator must not be null"}) } override fun toString(): String = "${numerator}/${denominator}" } • ؔ਺requireͰ෼฼͕0Ҏ֎Ͱ͋Δ͜ͱΛཁٻɺ൓ ͨ͠৔߹͸ΤϥʔΛ౤͛Δ 14 Koichiro Oishi, 2017/08/08

Slide 15

Slide 15 text

ΠχγϟϥΠβ(Swift ͦͷ1) ࣦഊͨ͠Βྫ֎Λ౤͛Δύλʔϯ init(numerator: Int, denominator: Int) throws { if denominator == 0 { throw NSError(domain: "denominator must not be null", code: -1, userInfo: nil) } self.numerator = numerator self.denominator = denominator } • ࠓճ͸ͪ͜ΒΛྫͰਐΊ·͢ 15 Koichiro Oishi, 2017/08/08

Slide 16

Slide 16 text

ΠχγϟϥΠβ(Swift ͦͷ2) ࣦഊͨ͠ΒnilΛฦ͢ύλʔϯ init?(numerator: Int, denominator: Int) { if denominator == 0 { return nil } self.numerator = numerator self.denominator = denominator } • ໭Γ஋͕Optionalܕʹ • ݺͼग़͠ଆͰUnwrap͕ඞཁ 16 Koichiro Oishi, 2017/08/08

Slide 17

Slide 17 text

ඇެ։ϓϩύςΟϝιου(Kotlin) ࠷େެ໿਺(greatest common divisor)ΛٻΊ͍ͨ ྫ͑͹ɺ4/6ͷ৔߹͸2/3ͱ͍ͨ͠ɻ tailrec private fun gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a% b) • private͚ͭΕ͹ϓϥΠϕʔτ • ͞Βʹ࠶ؼؔ਺ʹ͸tailrecΛ͚ͭΔ 17 Koichiro Oishi, 2017/08/08

Slide 18

Slide 18 text

ඇެ։ϓϩύςΟϝιου(Swift ͦͷ1) ಉ͘͡࠷େެ໿਺(greatest common divisor)ΛٻΊΔ ϝιου private func gcd(a: Int, b: Int) -> Int { return b == 0 ? a : gcd(a: b, b: a % b) } • ϩδοΫࣗମ͸ಉ͡ 18 Koichiro Oishi, 2017/08/08

Slide 19

Slide 19 text

ඇެ։ϓϩύςΟϝιου(Swift ͦͷ2) extension Rational: CustomStringConvertible { var description: String { let g = gcd(a: abs(numerator), b: abs(denominator)) return "\(numerator/g)/\(denominator/g)" } private func gcd(a: Int, b: Int) -> Int { return b == 0 ? a : gcd(a: b, b: a % b) } } ࣮૷લˠ10/6 ࣮૷ޙˠ5/3 19 Koichiro Oishi, 2017/08/08

Slide 20

Slide 20 text

ԋࢉࢠΦʔόʔϩʔυ(Kotlin ͦͷ1) ϝιουplusΛ௥Ճͯ͠Rationalಉ࢜ͷ଍͠ࢉΛͰ͖ ΔΑ͏ʹ͢Δ fun plus(that: Rational): Rational = Rational( numerator * that.denominator + that.numerator * denominator, denominator * that.denominator ) • rational1.plus(rational2) ͱॻ͚ΔΑ͏ʹͳΔ 20 Koichiro Oishi, 2017/08/08

Slide 21

Slide 21 text

ԋࢉࢠΦʔόʔϩʔυ(Kotlin ͦͷ2) ͞Βʹrational1 + ratiolan2 Έ͍ͨʹॻ͖͍ͨ operator fun plus(that: Rational): Rational = Rational( numerator * that.denominator + that.numerator * denominator, denominator * that.denominator ) • ԋࢉࢠΦʔόʔϩʔυ = operator overload Rational(10, 6) + Rational(1, 3) 2/1 ͱͰ͖Δ 21 Koichiro Oishi, 2017/08/08

Slide 22

Slide 22 text

ԋࢉࢠΦʔόʔϩʔυ(Swift) SwiftͰԋࢉࢠΛΦʔόʔϩʔυ͢Δͱ͜͏ͳΔ static func +(left: Rational, right: Rational) -> Rational { return try! Rational( numerator: left.numerator * right.denominator + right.numerator * left.denominator, denominator: left.denominator * right.denominator) } 22 Koichiro Oishi, 2017/08/08

Slide 23

Slide 23 text

ϝιουͷΦʔόʔϩʔυ(Kotlin) Rational(1, 2) + 1ͷΑ͏ͳܭࢉΛͰ͖ΔΑ͏ʹ͢Δɻ operator fun plus(n: Int): Rational = Rational(numerator + n * denominator, denominator) Rational(10, 6) + 1 8/3 ͱͰ͖ΔΑ͏ʹ 23 Koichiro Oishi, 2017/08/08

Slide 24

Slide 24 text

ϝιουͷΦʔόʔϩʔυ(Swift) static func +(rational: Rational, int: Int) -> Rational { return try! Rational(numerator: rational.numerator + int * rational.denominator, denominator: rational.denominator) } 24 Koichiro Oishi, 2017/08/08

Slide 25

Slide 25 text

֦ுؔ਺(Kotlin) • Intʹର͢Δ֦ுؔ਺ͱͯ͠RationalΛҾ਺ͱ͢Δ plusϝιουΛ௥Ճ operator fun Int.plus(r: Rational): Rational = r + this 1 + Rational(10, 6) 8/3 ͱͰ͖ΔΑ͏ʹ 25 Koichiro Oishi, 2017/08/08

Slide 26

Slide 26 text

֦ுؔ਺(Swift) • +ʹҾ਺ͱͯ͠ࠨลInt + ӈลRationalΛ࣮૷ static func +(left: Int, right: Rational) -> Rational { return right + left } 26 Koichiro Oishi, 2017/08/08

Slide 27

Slide 27 text

·ͱΊ ΍ͬͨ͜ͱ • Ϋϥεͷఆٛ • ϓϩύςΟɺϝιουɺΠχγϟϥΠβͷఏࣔ • ؔ਺Φʔόϩʔυ • طଘͷܕʹϝιουΛ௥Ճ(֦ுؔ਺) ଞͷݴޠͰ΋༗ཧ਺Ϋϥεͷ࣮૷Λͯ͠ΈΔͱษڧʹͳ Γͦ͏Ͱ͢Ͷʁ 27 Koichiro Oishi, 2017/08/08

Slide 28

Slide 28 text

͝঺հͨ͠Swiftͷ࣮૷ྫ͸ͪ͜Β • https:/ /gist.github.com/koishi -> SwiftRational.swift • https:/ /gist.github.com/koishi/ d54a38e3216aaaf87ac592465adb0695 ποίϛେ׻ܴͰ͢ 28 Koichiro Oishi, 2017/08/08

Slide 29

Slide 29 text

͝੩ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠ɻ 29 Koichiro Oishi, 2017/08/08