Slide 1

Slide 1 text

Swiftͷྻڍܕ͸ڧ͍(ཁग़య) ROPPONGI.swift ୈ2ճ
 @S_Shimotori

Slide 2

Slide 2 text

ͩΕ S_Shimotori (@S_Shimotori_pub) • ࣾձਓ2೔໨ • DroidKaigi 2018ͷNOCʹ͍ͨ • ٕज़ॻయʹߦ͖͍ͨؾ࣋ͪͰ͍ͬͺ͍ •

Slide 3

Slide 3 text

Swiftͷྻڍܕ͸ڧ͍ʂʂʂ

Slide 4

Slide 4 text

Swiftͷྻڍܕ͸ڧ͍ʂʂʂ ຊ౰ʹʁ

Slide 5

Slide 5 text

enum Day: Int { case sun = 1, mon, tue, wed, thu, fri, sat } enum class Day(val value: Int) { SUN(0), MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) } ʲDay.swiftʳ ʲDay.ktʳ Swiftؔ܎ͳ͘ͳ͍ʁ

Slide 6

Slide 6 text

ͦ΋ͦ΋Swiftͷྻڍܕͱ͸ • Raw Valuesͳྻڍܕ • ࣄલʹಉ͡ܕͷఆ਺Λ༩͓͑ͯ͘ • Ұൠతʹྻڍܕenumͱݺ͹ΕΔ΄͏ • Associated Valuesͳྻڍܕ • ม਺΍ఆ਺Λ࡞ͬͨ࣌ʹݸผʹ஋Λ༻ҙ͢Δ • Ұൠతʹ୅਺తσʔλܕͱݺ͹ΕΔ΄͏

Slide 7

Slide 7 text

enum Day: Int { case sun = 1, mon, tue, wed, thu, fri, sat } ʲDay.swiftʳ ʲBarcode.swiftʳ enum Barcode { case upc(Int, Int, Int, Int) case qrCode(String) }

Slide 8

Slide 8 text

Raw Values͸ڧ͍ʁ

Slide 9

Slide 9 text

ྻڍܕ(Raw Values)ͷಛ௕ • IntҎ֎ͷܕͷ஋΋ఆ਺ͱͯ࣋ͭ͜͠ͱ͕Ͱ͖Δ • C/C++/C#Ͱ͸ʮҰ࿈ͷ໊લ෇͖੔਺ఆ਺ʯͰ͔͠ͳ͍ • switchͰશྻڍࢠΛ໢ཏͤ͞Δ • ඞཁͳ΋ͷ͸ࣗಈతʹ༻ҙ͞ΕΔ • Int΍Stringͷ࣌͸ఆ਺஋Λ͓೚ͤʹͰ͖Δ • protocol RawRepresentable΁ͷద߹ • .rawValue΍ΠχγϟϥΠβͳͲ

Slide 10

Slide 10 text

ʲswiftc -print-ast Day.swiftʳ internal enum Day : Int { case sun, mon, tue, wed, thu, fri, sat internal typealias RawValue = Int internal var hashValue: Int { get } internal init?(rawValue: Int) internal var rawValue: Int { get } }

Slide 11

Slide 11 text

Associated Values͸ڧ͍ʁ

Slide 12

Slide 12 text

ʲBarcode.swiftʳ enum Barcode { case upc(Int, Int, Int, Int) case qrCode(String) }

Slide 13

Slide 13 text

ʲBarcode.swiftʳ enum Barcode { case upc(Int, Int, Int, Int) case qrCode(String) } ௚࿨ ௚ੵ ௚ੵ

Slide 14

Slide 14 text

indirect enum List { case cons(T, List) case `nil` } ʲList.swiftʳ

Slide 15

Slide 15 text

୅਺తσʔλܕΛදݱͰ͖Δݴޠ

Slide 16

Slide 16 text

୅਺తσʔλܕΛදݱͰ͖Δݴޠ

Slide 17

Slide 17 text

ʲswiftc -dump-ast Barcode.swiftʳ※Ұ෦লུ (source_file (enum_decl "Barcode" interface type='Barcode.Type' access=internal @_fixed_layout (enum_case_decl (enum_element_decl "qrCode" interface type='(Barcode.Type) -> (String) -> Barcode' access=internal)) (enum_element_decl "qrCode" interface type='(Barcode.Type) -> (String) -> Barcode' access=internal)))

Slide 18

Slide 18 text

enum Barcode { case upc(Int, Int, Int, Int) case qrCode(String) static func qrCode(_ str: String) -> Barcode { return Barcode.qrCode(str) } } sealed class Barcode { data class QRCode(val str: String): Barcode() companion object { fun QRCode(str: String): Barcode { return Barcode.QRCode(str) } } } ʲBarcode.swiftʳ ʲBarcode.ktʳ

Slide 19

Slide 19 text

͍Ζ͍ΖͳOptionalܕ

Slide 20

Slide 20 text

ʲstdlib/public/core/Optional.swiftʳ※Ұ෦লུ public enum Optional { case none case some(Wrapped) } pub enum Option { None, Some(T), } ʲsrc/libcore/option.rsʳ※Ұ෦লུ

Slide 21

Slide 21 text

let s = "foo"; s = null; // error let sn: string | null = "bar"; sn = null; // ok ʲnullable.ts with —strictNullChecks ʳ

Slide 22

Slide 22 text

ʲshape.tsʳ interface Square { kind: "square"; size: number; } interface Rectangle { kind: "rectangle"; width: number; height: number; } interface Circle { kind: "circle"; radius: number; } type Shape = Square | Rectangle | Circle;

Slide 23

Slide 23 text

sealed abstract class Option[+A] { ུ } final case class Some[+A](value: A) extends Option[A] { ུ } case object None extends Option[Nothing] { ུ } ʲsrc/library/scala/Option.scalaʳ※Ұ෦লུ

Slide 24

Slide 24 text

sealed abstract class Option[+A] { ུ } final case class Some[+A](value: A) extends Option[A] { ུ } case object None extends Option[Nothing] { ུ } ʲsrc/library/scala/Option.scalaʳ※Ұ෦লུ

Slide 26

Slide 26 text

class Animal {} class Cat: Animal {} let cat0: Optional = .some(Cat()) let animal0: Optional = cat0 enum MyOptional { case some(T) case none } let cat1: MyOptional = .some(Cat()) let animal1: MyOptional = cat1

Slide 27

Slide 27 text

class Animal {} class Cat: Animal {} let cat0: Optional = .some(Cat()) let animal0: Optional = cat0 enum MyOptional { case some(T) case none } let cat1: MyOptional = .some(Cat()) let animal1: MyOptional = cat1 cannot convert value of type 'MyOptional' to specified type 'MyOptional'

Slide 28

Slide 28 text

·ͱΊ • ྻڍܕͦͷ΋ͷ͕ઐചಛڐ͔ͩΒڧ͍ɺͱ͸ݴ͑ͳ͍ • ଞͷݴޠʹ΋ྻڍܕ΍୅਺తσʔλܕ͸͋Δ • ҎԼͷ࢓༷͸SwiftͷྻڍܕΛڧ͘͢Δ͔ʁ • ྻڍܕͱ୅਺తσʔλܕ͕ͪ͝Όࠞͥ • ྆छڞʹswitchͰ͸໢ཏ͠ͳ͚Ε͹ͳΒͳ͍ • ඞཁͳϝιουΛิ׬ • Optionalܕͷಛผѻ͍ •

Slide 29

Slide 29 text

ࢀߟจݙ The Swift Programming Language (Swift 4.1): Enumerations RawRepresentable - Swift Standard Library | Apple Developer Documentation SwiftͷOptional͸ͨͩͷenum? - Qiita SwiftͷArray͕ϛϡʔλϒϧͰ΋Covariantͳཧ༝ - Qiita

Slide 30

Slide 30 text

ࢀߟจݙ Chapter 6. Variants / Real World OCaml ιϑτ΢ΣΞٕ๏: No.6 (௚ੵܕͱ୅਺తσʔλܕ) C ྻڍମͷએݴ ྻڍܕ [C++] ྻڍܕ (C# ϓϩάϥϛϯά ΨΠυ) | Microsoft Docs Enum Classes - Kotlin Programming Language Effective Scala ྻڍܕ (enum) ͕ཉ͍͠ͱ͖ͷ Enumeration ͱ case object... - tnoda-scala ܕύϥϝʔλͱมҐࢦఆ · ScalaݚमςΩετ

Slide 31

Slide 31 text

ࢀߟจݙ Advanced Types - TypeScript Union Types͸௚࿨ܕͰ͸ͳ͍ | ࡶهா TypeScriptɺ͓લ΋͔ɿ null΍undefinedͷѻ͍͕ΠΠΧήϯա͗ʲࣄ࣮ޡೝ͋Γʳ - ᐻࢁਖ਼޾ͷΩϚΠϥࣂҭه TypeScriptɺ๻͕ѱ͔ͬͨɺΰϝϯɿ null΍undefinedͷѻ͍͸ϚτϞͩͬͨ - ᐻࢁਖ਼޾ͷΩϚΠϥࣂҭه