Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swiftの型システムに入門する - iOSDC Japan 2018

0cf23fed58f84e729aa59ba5d8d0baaf?s=47 ukitaka
August 31, 2018

Swiftの型システムに入門する - iOSDC Japan 2018

0cf23fed58f84e729aa59ba5d8d0baaf?s=128

ukitaka

August 31, 2018
Tweet

Transcript

  1. iOSDC Japan 2018 @ukitaka SwiftͷܕγεςϜʹೖ໳͢Δ lib/Semaͷา͖ํ

  2. ࣗݾ঺հ Yuki Takahashi @ukitaka ▸ iOS Engineer @ Mercari Fukuoka

    Office ▸ SwiftͷίϯύΠϥɺಛʹܕγεςϜʹڵຯ͕͋Γ·͢ɻ ▸ ͨ·ʹϒϩά΍QiitaΛॻ͍ͯ·͢ɻ
  3. ࠓ೔ͷςʔϚ SwiftͷܕγεςϜʹೖ໳͢Δ ▸ Swiftͷܕͷ͜ͱΛ΋ͬͱਂ͘஌Γ͍ͨਓΛλʔ ήοτͱͯ͠ɺSwiftίϯύΠϥͷ࣮૷ΛಡΈ࢝ ΊΒΕΔͱ͜Ζ·Ͱ͍࣋ͬͯ͘͜ͱΛ໨ඪ ▸ 2ํ޲͔ΒͷΞϓϩʔν ▸ SwiftίϯύΠϥͷ࣮૷ΛಡΉ

    ▸ SwiftͷܕγεςϜͷཧ࿦Λ஌Δ → શମΛ၆ᛌ͠ɺ࠷ॳͷҰาͷ͓ख఻͍
  4. ࠓ೔ͷςʔϚ ΞδΣϯμ ▸ SwiftͷܕγεςϜͷಛ௃Λ஌Δ ▸ Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ▸ SwiftͷܕγεςϜͷ࣮૷ΛಡΉ ▸ SwiftͷܕγεςϜͷཧ࿦Λ஌Δ

  5. Swiftͷ ܕγεςϜͷಛ௃Λ஌Δ

  6. SwiftͷܕγεςϜͷಛ௃Λ஌Δ SwiftͷܕγεςϜͷಛ௃ ▸ ܕਪ࿦ ▸ δΣωϦΫε ▸ αϒλΠϐϯά ▸ ଘࡏܕ

    (Existential type) ▸ ܕΫϥεɾݶఆܕ (Qualified type)
  7. SwiftͷܕγεςϜͷಛ௃Λ஌Δ ܕਪ࿦ ▸ Hindley-MilnerϥΠΫͳ੍໿(Constraint)ϕʔεͷܕਪ࿦ ▸ ྫ͑͹ม਺ͷܕΛ໌ࣔ͠ͳͯ͘΋ࠨล͔Βਪ࿦ͯ͘͠ΕΔ ▸ ӈล͔Βࠨล΋͍͚Δ ▸ ୅ೖʹݶΒͣɺ͍Ζ͍Ζͳͱ͜ΖͰܕΛ໌ࣔ͠ͳͯ͘΋Α͍

    ❌ ؔ਺ͷҾ਺ɾฦ஋ͷܕ͸লུͰ͖ͳ͍ɺ1expression/1statementʹด͍ͯ͡Δ
  8. SwiftͷܕγεςϜͷಛ௃Λ஌Δ δΣωϦΫε ▸ ίʔυੜ੒ϑΣʔζ·ͰؚΊͨίϯύΠϥͷ࣮ ૷ͱͯ͠͸໘ന͍ ▸ ܕγεςϜͱͯ͠͸͋Δҙຯཧ࿦௨Γ ▸ ܕਪ࿦Λ࢖ͬͯଟ૬ੑΛ࣮ݱ͢Δ ▸

    ͨͩ͠ܕύϥϝʔλʹର͢Δ੍໿पΓ͸ޙड़ͷ ݶఆܕ(Qualified type)ͱؔ࿈ͯ͘͠Δ
  9. SwiftͷܕγεςϜͷಛ௃Λ஌Δ ଘࡏܕ (Existential Type) ▸ = ܕͱͯ͠ͷprotocol ▸ Swift͸ଘࡏܕΛ͋Δҙຯ௚઀తʹѻ͑Δ௝͍͠ ݴޠ

    ▸ ଘࡏܕͩͱҙࣝͤͣʹ࢖͑Δݴޠઃܭ ▸ Opening existential౳͕ಋೖ͞ΕΔͱଘࡏܕͱ ͸ͳʹ͔Λ஌Βͳ͍ͱཧղͮ͠Β͍͜ͱ΋͋Δ ͔΋͠Εͳ͍ → গͳ͘ͱ΋protocolܕ = ଘࡏܕͰ͋Δͱ͍͏͜ͱΛ ಄ͷย۱ʹஔ͍͓ͯ͘ͱྑ͍
  10. SwiftͷܕγεςϜͷಛ௃Λ஌Δ ܕΫϥεɾݶఆܕ(Qualified Type) ▸ = ܕύϥϝʔλͷ੍໿ͱͯ͠ͷprotocol ▸ T: Equatable ▸

    Conditional Conformance ▸ ݶఆܕ͸ʮܕΫϥεΛܕγεςϜͰѻ͏ʯͨΊͷ ཧ࿦ ▸ ܕ্ͷड़ޠʹΑ੍ͬͯ໿Λ͔͚Δ ▸ Jones, Mark P. Qualified Types: Theory and Practice. Cambridge University Press, 1994.
  11. SwiftͷܕγεςϜͷಛ௃Λ஌Δ αϒλΠϐϯά ▸ αϒλΠϐϯάࣗମ͸ଞͷݴޠʹ΋ݟΒΕΔ͕ɺSwiftͷͦΕ͸͔ͳΓಛ௃త ▸ classͱͦͷܧঝؔ܎͚ͩͰ͸ͳ͍ ▸ Optionalʹର͢ΔαϒλΠϐϯά ▸ T͸T?ͷαϒλΠϓ

    ▸ Existentialʹର͢ΔαϒλΠϐϯά ▸ T <: U, U: P 㱺 T <: P → ҉໧ม׵Λࢧ͑Δ࢓૊Έ
  12. SwiftͷܕγεςϜͷಛ௃Λ஌Δ SwiftͷܕγεςϜ͕͍࣋ͬͯͳ͍΋ͷ (ൈਮ) ❌ ׬શͳܕਪ࿦ ❌ ߴΧΠϯυଟ૬ (Haskell, ScalaͳͲ) ❌

    Rank2Ҏ্ͷଟ૬ ❌ ೚ҙͷδΣωϦοΫͳܕʹର͢Δڞมɾ൓มͷࢦఆ → Կ͔ͱͷτϨʔυΦϑͳͷͰɺ͋Δ͔Βྑ͍ͱ͍͏Θ͚Ͱ΋ͳ͍ Swift͸͜ͷลΓͷόϥϯε͕ͱΕ͍ͯΔྑ͍ݴޠ
  13. Swiftͷܕਪ࿦ͱͦͷ σόοάํ๏Λ஌Δ

  14. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ҙຯղੳɾܕਪ࿦ɾܕݕࠪ ▸ ʮܕʯͷνΣοΫ͸ίϯύΠϥͷҙຯղੳϑΣʔζͰߦΘΕΔ ▸ SwiftίϯύΠϥͷҙຯղੳϑΣʔζͰ΍͍ͬͯΔ͜ͱͷ9ׂ͘Β͍͕ܕݕࠪ ▸ ܕਪ࿦ =ʮܕݕ͕ࠪ௨ΔΑ͏ͳܕΛ࠶ߏங͢Δ͜ͱʯͳͷͰ͋Δҙຯηοτ ▸

    ܕਪ࿦͕ԿΛ͍ͯ͠Δͷ͔͕Θ͔Ε͹ܕγεςϜ͕Θ͔Δ
  15. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ίϯύΠϥͷίʔυΛಡΉલʹ ▸ ͍͖ͳΓίϯύΠϥͷίʔυΛಡΉͷ͸ͪΐͬͱେม ▸ ·ͣσόοάͷͨΊͷίϚϯυΛ஌͓ͬͯ͘ͱίʔυΛಡ·ͣʹڍಈΛ֬ೝͰ͖Δ ▸ લఏ஌ࣝͱͯ͠ίϯύΠϧͱASTͷϑΣʔζΛ֬ೝ͓ͯ͘͠ Swift AST

    AST (typed) lib/Parse lib/Sema ͕͜͜ܕʹؔ͢ΔΞϨίϨ͕ߦΘΕΔͱ͜Ζ
  16. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ASTΛग़ྗ͢ΔίϯύΠϥΦϓγϣϯ2ͭ % swiftc -help OVERVIEW: Swift compiler USAGE: swiftc

    [options] <inputs> MODES: -dump-ast Parse and type-check input file(s) and dump AST(s) -dump-parse Parse input file(s) and dump AST(s) Swift AST AST (typed) -dump-parse -dump-ast lib/Sema
  17. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ASTΛग़ྗ͢ΔίϯύΠϥΦϓγϣϯ2ͭ % swiftc -help OVERVIEW: Swift compiler USAGE: swiftc

    [options] <inputs> MODES: -dump-ast Parse and type-check input file(s) and dump AST(s) -dump-parse Parse input file(s) and dump AST(s) Swift AST AST (typed) ஌Γ͍ͨͷ͸͜ͷաఔͷdumpํ๏ lib/Sema
  18. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ -debug-constraints ▸ ܕਪ࿦ɺܕݕࠪͷաఔΛग़ྗ͢ΔΦϓγϣϯ ▸ Constraints = ܕਪ࿦࣌ʹ࢖͏ʮAͱBͷܕ͸ಉ͡ʯͷΑ͏ͳ੍໿(Constraint)ͷ͜ͱ ▸ ܕγεςϜ΍lib/SemaΛཧղ͢Δ্Ͱͷ࠷ॏཁίϯύΠϥΦϓγϣϯ

    Swift AST AST (typed) lib/Parse lib/Sema -debug-constraints
  19. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ -debug-constraints % swiftc \ -frontend \ -typecheck \ -debug-constraints

    \ test.swift
  20. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ -debug-constraints let i = 42 → ग़ྗ͸Ͱ͖ΔΑ͏ʹͳͬͨͷͰ͔͜͜Β͸ಡΈํΛղઆ

  21. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ܕਪ࿦ɾܕݕࠪͷྲྀΕΛ஌Δ 1. ܕ͕໌ࣔ͞Ε͍ͯͳ͍ͱ͜ΖΛܕม਺(Type Variable)Ͱ͓͘ 2. ܕม਺ͷ੍໿(Constraint)Λੜ੒͢Δ 3. ੍໿Λղ͍ͯղ(Solution)Λݟ͚ͭΔ 4.

    ͦͷղΛݩͷASTʹద༻ͭͭ͠ඞཁͳॻ͖׵͑(Rewrite)Λߦ͏
  22. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ܕਪ࿦ɾܕݕࠪͷྲྀΕΛ஌Δ $T1 $T0 let i = 42 1. ܕ͕໌ࣔ͞Ε͍ͯͳ͍ͱ͜ΖΛܕม਺(Type

    Variable)Ͱ͓͘
  23. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ܕਪ࿦ɾܕݕࠪͷྲྀΕΛ஌Δ let i = 42 2. ܕม਺ͷ੍໿(Constraint)Λੜ੒͢Δ $T0 ͸੔਺Ϧςϥϧ

    $T0 ͸$T1ʹม׵Ͱ͖Δ
  24. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ܕਪ࿦ɾܕݕࠪͷྲྀΕΛ஌Δ let i = 42 3. ੍໿Λղ͍ͯղ(Solution)Λݟ͚ͭΔ $T1 =

    Int $T0 = Int
  25. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ܕਪ࿦ɾܕݕࠪͷྲྀΕΛ஌Δ let i: Int = Int2048(_builtinIntegerLiteral: 42) 4. ͦͷղΛݩͷASTʹద༻ͭͭ͠ඞཁͳॻ͖׵͑(Rewrite)Λߦ͏

    Ϧςϥϧ͕ؔ਺builtinݺͼग़͠ʹ ܕ͕ܾ·ͬͨঢ়ଶ ※ ASTΛ۩৅จ๏ʹ໭ͨ͠Πϝʔδ
  26. Swiftͷܕਪ࿦ͱͦͷσόοάํ๏Λ஌Δ ܕਪ࿦ɾܕݕࠪͷྲྀΕΛ஌Δ 1. ܕ͕໌ࣔ͞Ε͍ͯͳ͍ͱ͜ΖΛܕม਺(Type Variable)Ͱ͓͘ 2. ܕม਺ͷ੍໿(Constraint)Λੜ੒͢Δ 3. ੍໿Λղ͍ͯղ(Solution)Λݟ͚ͭΔ 4.

    ͦͷղΛݩͷASTʹద༻ͭͭ͠ඞཁͳॻ͖׵͑(Rewrite)Λߦ͏ → ͜ͷྲྀΕͰग़ྗ͞Ε͍ͯΔ
  27. SwiftͷܕγεςϜ ͷ࣮૷ΛಡΉ

  28. SwiftͷܕγεςϜͷ࣮૷ΛಡΉ lib/Sema ▸ Sema = ҙຯղੳ (Semantic Analysis) ▸ ओʹܕਪ࿦΍ܕݕࠪΛ୲౰͢ΔϞδϡʔϧ

  29. SwiftͷܕγεςϜͷ࣮૷ΛಡΉ ओཁͳΫϥε ▸ TypeChecker → ܕݕࠪ୲౰ ▸ TypeCheck*.cppʹ࣮૷͕෼ׂ͞Ε͍ͯΔ ▸ ConstraintSystem

    → ܕਪ࿦୲౰ ▸ CS*.cpp ʹ࣮૷͕෼ׂ͞Ε͍ͯΔ
  30. SwiftͷܕγεςϜͷ࣮૷ΛಡΉ ओཁͳΫϥε ▸ TypeChecker͕ࣜ͝ͱʹ ConstraintSystemΛΠϯελϯεԽ͠ ͯ࢖͍ͬͯΔΠϝʔδ

  31. SwiftͷܕγεςϜͷ࣮૷ΛಡΉ ConstraintSystemͷ࢓ࣄ - ੍໿ੜ੒ ▸ createTypeVariableͰܕม਺Λ࡞Δ ▸ addConstraintͰ੍໿Λੜ੒ˍ؅ཧ͢ Δ ▸

    ConstraintKindͰ੍໿ͷछྨΛࢦఆ ▸ ੍໿͸ConstraintGraphͱݺ͹ΕΔά ϥϑͰ؅ཧ ੍໿ੜ੒ͷྫ
  32. SwiftͷܕγεςϜͷ࣮૷ΛಡΉ ConstraintSystemͷ࢓ࣄ - ੍໿ͷ୯ҰԽ ▸ solveͰ੍໿Λղ͘ ▸ جຊతʹ͸ղͷީิΛͲΜͲΜͨΊ͠ ͍ͯ͘

  33. SwiftͷܕγεςϜͷ࣮૷ΛಡΉ ConstraintSystemͷ࢓ࣄ - ղͷద༻ͱॻ͖׵͑ ▸ applySolutionͷதͰExprRewriterͱ͍͏ΫϥεΛ࢖ͬͯASTΛॻ͖׵͑ ͯܕͷ৘ใΛຒΊΔ

  34. SwiftͷܕγεςϜͷ࣮૷ΛಡΉ lib/SemaΛ΋ͬͱಡΉʹ͸ ▸ ͜͜ʹॻ͍ͨͷ͸େ·͔ͳྲྀΕͷΈ ▸ overloadͷղܾɺϝιουݺͼग़͠ͷղܾͳͲ·ͩ·ͩॏ͍࿩୊͸ͨ͘͞ Μ͋Δ ▸ ͦΕΒ΋جຊతʹ͸-debug-constraintsʹදΕΔ͜ͱ͕ଟ͍ͷͰɺग़ྗͱ ࣮૷ΛோΊͳ͕Β͕Μ͹Δ

    ▸ XcodeͰ্खʹσόοά͠Α͏ʂ
  35. SwiftͷܕγεςϜ ͷཧ࿦Λ஌Δ

  36. SwiftͷܕγεςϜͷཧ࿦Λ஌Δ SwiftͷܕγεςϜͷཧ࿦Λ஌Δ ▸ ཧ࿦Λ஌Ε͹࣮૷͕ಡΈ΍͘͢ͳΔ ▸ SwiftίϯύΠϥͷ࣮૷͸ෳࡶʹབྷΈ߹ͬͯ͸͍Δ͕ɺجຊతʹ͸͍͔ͭ͘ͷτϐοΫ ͷू·Γɻͦͯ͠୯ମͰݟΔͱཧ࿦௨Γ࣮૷͞Ε͍ͯΔ৔߹͕ଟ͍ɻ ▸ ֓೦Λ஌͍ͬͯΔ͚ͩͰ΋͍ͩͿೖΓ΍͍͢ ▸

    Opening existentialͷΑ͏ʹͦ΋ͦ΋֓೦Λ஌Βͳ͍ͱҙຯ͕Θ͔Βͳ͍΋ͷ΋͋Δ → ৄࡉͳղઆ͸Ͱ͖ͳ͍ͷͰɺֶͼํͷΈ঺հ
  37. SwiftͷܕγεςϜͷཧ࿦Λ஌Δ ܕγεςϜೖ໳(TaPL) ▸ Types and Programming Language (TaPL) ▸ ܕͳ͠ͷϥϜμܭࢉͷΑ͏ͳجૅతͳͱ͜Ζ͔

    Βঃʑʹݱ୅ͷϓϩάϥϛϯάݴޠ͕࣋ͭΑ͏ ͳػೳΛ෇͚Ճ͍͑ͯ͘ ▸ 1ষ͸ແྉͰެ։͞Ε͍ͯΔʂʮܕʯͱ͸Կ͔Λ ஌Δʹ͸࠷ߴͷࢿྉ → SwiftΛ஌ΔͨΊʹ͸Ͳ͏ಡΊ͹ྑ͍ʁ
  38. SwiftͷܕγεςϜͷཧ࿦Λ஌Δ TaPLͷา͖ํ ▸ લఏͱͯ͠ɺ͢΂ͯͷষΛಡΉඞཁ͸ͳ͍ ▸ 9ষ·Ͱ͸جૅͱͯ͠ಡΜͰ͓͘ͱΑͦ͞͏ ▸ લ൒͸ʮཧ࿦ͷষ → OCamlʹΑΔ࣮૷ͷষʯͷ

    ܁Γฦ͠ͳͷͰ࣮૷ΛSwiftͰ΍ͬͯΈΔͱ͍͏ ͷ͸ྑ͍ख ▸ ઌ΄ͲݟͨΑ͏ͳSwiftͷܕγεςϜͷಛ௃Λ ѻ͍ͬͯΔͷ͸15ষɺ22ষɺ24ষ͋ͨΓ ܕγεςϜೖ໳−ϓϩάϥϛϯάݴޠͱܕͷཧ࿦− ংจΑΓҾ༻
  39. SwiftͷܕγεςϜͷཧ࿦Λ஌Δ ୈ22ষ ܕ࠶ߏங ▸ ܕ࠶ߏங = ܕਪ࿦ ▸ ܕਪ࿦ͱSwift͕࣋ͭΑ͏ͳδΣωϦΫεʹ͍ͭ ͯऔΓѻ͍ͬͯΔষ

    ▸ SwiftͷδΣωϦοΫͳؔ਺͸ܕਪ࿦ͱηοτͰ ఏڙ͞Ε͍ͯΔػೳ (letଟ૬) ͱ͍͏͜ͱ͕Θ͔ Δ The secret life of types in Swift https://medium.com/@slavapestov/the-secret-life-of-types-in-swift-ff83c3c000a5 ܕγεςϜೖ໳−ϓϩάϥϛϯάݴޠͱܕͷཧ࿦− ୈ22ষʮܕ࠶ߏஙʯΑΓҾ༻
  40. SwiftͷܕγεςϜͷཧ࿦Λ஌Δ ୈ15ষ ෦෼ܕ෇͚ ▸ ෦෼ܕ෇͚ = αϒλΠϐϯά ▸ ͋Δܕͱ͋Δܕ͕αϒλΠϓؔ܎Ͱ͋Δ͔Ͳ͏ ͔͸ɺͦͷܕγεςϜͰͷʮܾΊʯͷ໰୊ͩͱ

    ͍͏͜ͱ͕Θ͔Ε͹Αͦ͞͏ ▸ 15.5અͷʮܕڧ੍ҙຯ࿦ʯͷͱ͜Ζ͸·͞ʹ SwiftίϯύΠϥͰߦΘΕ͍ͯΔ͜ͱ͕ॻ͍ͯ͋ ΔͷͰඞಡ ܕγεςϜೖ໳−ϓϩάϥϛϯάݴޠͱܕͷཧ࿦− ୈ15ষʮ෦෼ܕ෇͚ʯΑΓҾ༻
  41. SwiftͷܕγεςϜͷཧ࿦Λ஌Δ ୈ24ষ ଘࡏܕ ▸ λΠτϧ௨Γଘࡏܕ(Existential type)Λѻ͏ষ ▸ ଘࡏܕ͕ʮ͋ΔܕͱͦͷܕΛ࢖ͬͨܕʯͷ૊ɺ ଘࡏܕͷ஋͸ʮ͋Δܕ͕۩ମతʹͳʹ͔ +

    ͦͷ ஋ʯͷϖΞͰ͋Δͱ͍͏ͱ͜Ζ͔͑ͭ͞ΊΕ͹ Swiftͷଘࡏܕ΋ා͘ͳ͍ ϖΞͬΆ͍งғؾ ܕγεςϜೖ໳−ϓϩάϥϛϯάݴޠͱܕͷཧ࿦− ୈ24ষʮଘࡏܕʯΑΓҾ༻
  42. SwiftͷܕγεςϜͷཧ࿦Λ஌Δ Swiftʹؔ܎͋Γͦ͏Ͱؔ܎ͳ͍ষ ▸ ୈ23ষ શশܕ ▸ ͍ΘΏΔδΣωϦΫεͷ͜ͱͩͱࢥͬͯಡΉͱϋϚΔ ▸ Swift͸͜ͷষͰऔΓ্͛ΒΕ͍ͯΔΑ͏ͳλΠϓͷڧྗͳδΣωϦΫεΛ࣋ͨͳ͍ ▸

    ୈ26ষ ༗քྔԽ ▸ ͺͬͱݟ T: EquatableͷΑ͏ͳ੍໿ʹ͍ͭͯͷཧ࿦తഎܠ͕ॻ͍ͯ͋ΔΑ͏ʹΈ͑Δ͕ɺ࣮͸ؔ܎ ͳ͍ (see: ݶఆܕ) ▸ ༗քྔԽ͸αϒλΠϐϯάʹΑ੍ͬͯ໿Λ͔͚Δɺݶఆܕ͸ܕ্ͷड़ޠͰ੍໿Λ͔͚Δͱ͍͏ҧ͍
  43. SwiftͷܕγεςϜͷཧ࿦Λ஌Δ ΋͠ܕγεςϜͷೖ໳ʹ࠳ંͨ͠Β ▸ ࠳ં͚ͨ͠ͲͦΕͰ΋TaPLಡΈ͍ͨͱ͍͏ͱ͍͏ํ͸ɺ(ه߸)࿦ཧֶ͔Β͵Δͬͱೖ͍ͬͯ͘ ͱΑͦ͞͏ ▸ ๻͸࠳ંͯ͜͠ΜͳྲྀΕͰ࠶ೖ໳͠·ͨ͠

  44. ·ͱΊ

  45. ·ͱΊ SwiftͷܕγεςϜʹೖ໳͢Δʹ͸ ▸ -debug-constraintsΛ࢖͍͜ͳͯ͠ܕਪ࿦ͷڍಈΛ೺Ѳͭͭ͠ɺίϯύΠ ϥͷιʔείʔυΛಡΈਐΊΑ͏ ▸ ཧ࿦͸࣮૷ΛಡΈղ͘ώϯτͱͯ͠༗ޮͳ͜ͱ΋͋ΔɺTaPLΛಡΜͰΈΑ ͏

  46. ·ͱΊ SwiftͷܕγεςϜʹೖ໳͢Δʹ͸ ▸ ༏ͯ͘͠ฏ࿨Ͱ༗ҙٛͳswiftcษڧձ͋Γ·͢

  47. ͋Γ͕ͱ͏͍͟͝·ͨ͠