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

SwiftのStringの文字の数え方を完全理解する

 SwiftのStringの文字の数え方を完全理解する

SwiftはUnicodeの扱いに非常に長けた言語であり、絵文字を含む文字列でも正しい文字数を計算してくれます。
その反面、Unicodeの複雑さに引きずられてしまい、直感的な操作ができない時もあります。たとえば、 string[2] と書いても3番目の文字を取得することはできません。

そんな複雑なところのあるSwiftの文字列処理ですが、複雑なものを受け入れてきちんと理解するのはそこまで難しいものではありません。

このトークでは、Unicodeとの関係を意識しながら、Swiftの文字数の扱い方とその裏にある考え方を解説します。

Takanori Hirobe

September 05, 2019
Tweet

More Decks by Takanori Hirobe

Other Decks in Programming

Transcript

  1. SwiftͷStringͷจࣈͷ
    ਺͑ํΛ׬શཧղ͢Δ
    Takanori Hirobe @taka1068

    View Slide

  2. • ኍ෦ وಙ

    • ϑΣϯϦϧגࣜձࣾॴଐ
    ࣗݾ঺հ

    View Slide

  3. ࣗݾ঺հ
    • ኍ෦ وಙ

    • ϑΣϯϦϧגࣜձࣾॴଐ
    ΰʔϧυεϙϯαʔ

    View Slide

  4. ࣗݾ঺հ
    • ኍ෦ وಙ

    • ϑΣϯϦϧגࣜձࣾॴଐ
    ΰʔϧυεϙϯαʔ
    Ϙτϧ΢Υʔλʔεϙϯαʔ

    View Slide

  5. ࣗݾ঺հ
    • ኍ෦ وಙ

    • ϑΣϯϦϧגࣜձࣾॴଐ
    ΰʔϧυεϙϯαʔ
    Ϙτϧ΢Υʔλʔεϙϯαʔ

    View Slide

  6. ΞδΣϯμ
    - SwiftͷStringʹ͍ͭͯ

    - Unicodeʹ͍ͭͯ

    - Stringͱཁૉͷஔ͖׵͑ʹ͍ͭͯ

    View Slide

  7. ΞδΣϯμ
    -SwiftͷStringʹ͍ͭͯ
    - Unicodeʹ͍ͭͯ

    - Stringͱཁૉͷஔ͖׵͑ʹ͍ͭͯ

    View Slide

  8. print("Hello, iOSDC!")

    View Slide

  9. String

    View Slide

  10. String
    Value Type
    Bridges to NSString

    View Slide

  11. String
    Value Type
    UTF-8 Encoded
    Hashable
    Bridges to NSString

    View Slide

  12. String
    Value Type
    UTF-8 Encoded
    Equatable Hashable
    Bridges to NSString
    Collection

    View Slide

  13. String
    Value Type
    UTF-8 Encoded
    Equatable Hashable
    Bridges to NSString
    Collection

    View Slide

  14. Collection

    View Slide

  15. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"

    View Slide

  16. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    let first = array[0]

    View Slide

  17. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    let first = array[0]
    let first = array[array.startIndex]
    or
    better

    View Slide

  18. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    let first = array[0]

    View Slide

  19. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    let first = array[0]
    Int
    ഑ྻͷཁૉͷܕ

    View Slide

  20. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int

    View Slide

  21. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    let first = string[0]

    View Slide

  22. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    let first = string[0]

    View Slide

  23. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    let first = string[string.startIndex]

    View Slide

  24. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    let first = string[string.startIndex]
    String.Index
    Character

    View Slide

  25. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    let startIdx = str.startIndex
    let index = str.index(startIdx, offsetBy: 5)
    let fifthChar = str[index]

    View Slide

  26. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    let startIdx = str.startIndex
    let index = str.index(startIdx, offsetBy: 5)
    let fifthChar = str[index]

    View Slide

  27. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character

    View Slide

  28. Collection
    var array = [ , 20, 30, 40, 50]
    var string = “ bc͍͋͏͓͑”
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    10 Λ 100 ʹม͑Δ
    a Λ X ʹม͑Δ
    a
    10

    View Slide

  29. Collection
    X
    100
    var array = [ , 20, 30, 40, 50]
    var string = “ bc͍͋͏͓͑”
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character

    View Slide

  30. Collection
    var array = [100, 20, 30, 40, 50]
    var string = "Xbc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    array[0] = 100

    View Slide

  31. Collection
    var array = [100, 20, 30, 40, 50]
    var string = "Xbc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    array[0] = 100
    "

    View Slide

  32. Collection
    var array = [100, 20, 30, 40, 50]
    var string = "Xbc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character

    View Slide

  33. Collection
    var array = [100, 20, 30, 40, 50]
    var string = "Xbc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    string[string.startIndex] = "X"

    View Slide

  34. Collection
    var array = [100, 20, 30, 40, 50]
    var string = "Xbc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    string[string.startIndex] = "X"
    #

    View Slide

  35. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈʹΑΔมߋ: OK
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    ఴࣈʹΑΔมߋ: NG

    View Slide

  36. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈʹΑΔมߋ: OK
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    ఴࣈʹΑΔมߋ: NG

    View Slide

  37. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈʹΑΔมߋ: OK
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    ఴࣈʹΑΔมߋ: NG

    View Slide

  38. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈʹΑΔมߋ: OK
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    ఴࣈʹΑΔมߋ: NG
    count͸5
    count͸8

    View Slide

  39. Collection
    let array = [10, 20, 30, 40, 50]
    let string = "abc͍͋͏͓͑"
    ఴࣈΞΫηε: Int
    ཁૉͷܕ: Int
    ఴࣈʹΑΔมߋ: OK
    ఴࣈΞΫηε: String.Index
    ཁૉͷܕ: Character
    ఴࣈʹΑΔมߋ: NG

    View Slide

  40. ಉ͡Collectionͱ͍ͬͯ΋ѻ͍ํ
    ͕গ͠ҧ͏
    - Stringͷํ͕ѻ͍ʹ͍͘

    View Slide

  41. ΞδΣϯμ
    - SwiftͷStringʹ͍ͭͯ

    -Unicodeʹ͍ͭͯ
    - Stringͱཁૉͷஔ͖׵͑ʹ͍ͭͯ

    View Slide

  42. ʮͺʯͱ͍͏จࣈΛ

    UnicodeͰද͢

    View Slide

  43. ͺ ͺ
    let pa1 = “…”
    let pa2 = “…”
    print(pa1, pa2) // ͺ ͺ

    View Slide

  44. ͺ ͺ
    let pa1 = “…”
    let pa2 = “…”
    print(pa1, pa2) // ͺ ͺ

    View Slide

  45. ͺ ͺ
    จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  46. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  47. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A
    ʮͺʯΛද͢εΧϥ஋(͋Δछͷූ߸)୯ମͰʮͺʯΛද͢

    View Slide

  48. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  49. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A
    ʮ͸ʯͱʮ㿇
    ʯΛ૊Έ߹ΘͤͯʮͺʯΛද͢ɻ

    View Slide

  50. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  51. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  52. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  53. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  54. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  55. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  56. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  57. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  58. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  59. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  60. จࣈ ͺ ͺ
    Unicode

    Scalar
    ͺ

    U+3071
    ͸

    U+306F



    U+309A

    View Slide

  61. View Slide

  62. View Slide

  63. View Slide

  64. View Slide

  65. จࣈ
    $ &
    Unicode

    Scalar
    U+1F469 U+200D U+1F692 U+1F3E3 U+1F1EF U+1F1F5

    View Slide

  66. จࣈ
    $ &
    Unicode

    Scalar
    U+1F469 U+200D U+1F692 U+1F3E3 U+1F1EF U+1F1F5

    View Slide

  67. ֦ுॻهૉΫϥελ

    View Slide

  68. ֦ுॻهૉΫϥελ
    • ӳޠͰ͸ Extended Grapheme Cluster

    View Slide

  69. https://developer.apple.com/documentation/swift/character

    View Slide

  70. https://developer.apple.com/documentation/swift/character

    View Slide

  71. https://developer.apple.com/documentation/swift/character

    View Slide

  72. https://developer.apple.com/documentation/swift/character

    View Slide

  73. ֦ுॻهૉΫϥελ
    • ӳޠͰ͸ Extended Grapheme Cluster

    • SwiftͷCharacterܕʹ֘౰

    View Slide

  74. ֦ுॻهૉΫϥελ
    • ӳޠͰ͸ Extended Grapheme Cluster

    • SwiftͷCharacterܕʹ֘౰

    • Ϣʔβʔʹͱͬͯͷʮ1จࣈʯ

    View Slide

  75. "\r\n"͸1จࣈ

    View Slide

  76. https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries

    View Slide

  77. งғؾΛײͯ͡ΈΔ

    View Slide

  78. งғؾΛײͯ͡ΈΔ
    "ͺa\r\n&"

    View Slide

  79. U+306F U+309A U+0A U+1F146 U+200D U+1F692
    U+61 U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  80. U+306F U+309A U+0A U+1F146 U+200D U+1F692
    U+61 U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    1 2 3 4

    View Slide

  81. U+306F
    U+309A U+0A U+1F146 U+200D U+1F692
    U+61 U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  82. U+309A U+0A U+1F146 U+200D U+1F692
    U+61 U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F

    View Slide

  83. U+309A U+0A U+1F146 U+200D U+1F692
    U+61 U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F: ͻΒ͕ͳͷʮ͸ʯ

    View Slide

  84. U+309A
    U+0A U+1F146 U+200D U+1F692
    U+61 U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F: ͻΒ͕ͳͷʮ͸ʯ

    View Slide

  85. U+309A
    U+0A U+1F146 U+200D U+1F692
    U+61 U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F: ͻΒ͕ͳͷʮ͸ʯ

    View Slide

  86. U+309A: ʮ ʄʯ
    U+0A U+1F146 U+200D U+1F692
    U+61 U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F: ͻΒ͕ͳͷʮ͸ʯ

    View Slide

  87. U+309A: ʮ ʄʯ
    U+0A U+1F146 U+200D U+1F692
    U+61 U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F: ͻΒ͕ͳͷʮ͸ʯ
    Nonspacing Mark

    View Slide

  88. U+61
    U+309A: ʮ ʄʯ
    U+0A U+1F146 U+200D U+1F692
    U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F: ͻΒ͕ͳͷʮ͸ʯ

    View Slide

  89. U+61
    U+309A: ʮ ʄʯ
    U+0A U+1F146 U+200D U+1F692
    U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F: ͻΒ͕ͳͷʮ͸ʯ

    View Slide

  90. U+61: ʮaʯ
    U+309A: ʮ ʄʯ
    U+0A U+1F146 U+200D U+1F692
    U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F: ͻΒ͕ͳͷʮ͸ʯ

    View Slide

  91. U+61: ʮaʯ
    U+309A: ʮ ʄʯ
    U+0A U+1F146 U+200D U+1F692
    U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    U+306F: ͻΒ͕ͳͷʮ͸ʯ
    ͺ

    View Slide

  92. U+61: ʮaʯ
    U+0A U+1F146 U+200D U+1F692
    U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  93. U+61: ʮaʯ
    U+0A U+1F146 U+200D U+1F692
    U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  94. U+61: ʮaʯ
    U+0A U+1F146 U+200D U+1F692
    U+0D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  95. U+61: ʮaʯ
    U+0A U+1F146 U+200D U+1F692
    U+0D: Carriage Return
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  96. U+61: ʮaʯ
    U+0A U+1F146 U+200D U+1F692
    U+0D: Carriage Return
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    a

    View Slide

  97. U+0A U+1F146 U+200D U+1F692
    U+0D: Carriage Return
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  98. U+1F146 U+200D U+1F692
    U+0D: Carriage Return
    U+0A
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  99. U+1F146 U+200D U+1F692
    U+0D: Carriage Return
    U+0A
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  100. U+1F146 U+200D U+1F692
    U+0D: Carriage Return
    U+0A: Line Feed
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  101. U+1F146 U+200D U+1F692
    U+0D: Carriage Return
    U+0A: Line Feed
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    \r\n ͷ૊Έ߹Θͤ͸
    ಛผѻ͍

    View Slide

  102. U+1F146 U+200D U+1F692
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  103. U+200D U+1F692
    U+1F1EF
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  104. U+200D U+1F692
    U+1F1EF
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  105. U+200D U+1F692
    U+1F1EF:
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    J

    View Slide

  106. U+200D U+1F692
    U+1F1EF:
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    ࠃίʔυͷʮJʯ
    J

    View Slide

  107. U+200D
    U+1F1EF:
    U+1F1F5
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    J

    View Slide

  108. U+200D
    U+1F1EF:
    U+1F1F5
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    J

    View Slide

  109. U+200D
    U+1F1EF:
    U+1F1F5:
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    J
    P

    View Slide

  110. U+200D
    U+1F1EF:
    U+1F1F5:
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    J
    P
    ࠃίʔυʮJʯ+ʮPʯ
    Ͱ೔ຊ

    View Slide

  111. U+200D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5

    View Slide

  112. U+200D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    1 2 3 4

    View Slide

  113. U+200D
    จࣈ ͺ a \r \n &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+0A U+1F1EF U+1F1F5
    1 2 3 4
    ΋͠\nͰ͸ͳͯ͘ʮbʯ
    ͩͬͨΒ

    View Slide

  114. U+200D
    จࣈ ͺ a \r b &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+62 U+1F1EF U+1F1F5
    1 2 3 4

    View Slide

  115. U+200D
    จࣈ ͺ a \r b &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+62 U+1F1EF U+1F1F5
    1 2 3 4
    \r ͱ b ͸݁߹͠ͳ͍

    View Slide

  116. U+200D
    จࣈ ͺ a \r b &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+62 U+1F1EF U+1F1F5
    1 2 3 4 5

    View Slide

  117. U+200D
    จࣈ ͺ a \r b &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+62 U+1F1EF U+1F1F5
    1 2 3 4 5
    4จࣈ໨ͩͬͨ΋ͷ͕
    5จࣈ໨ʹ

    View Slide

  118. U+200D
    จࣈ ͺ a \r b &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+62 U+1F1EF U+1F1F5
    1 2 3 4 5
    N൪໨ͷจࣈΛ஌ΔͨΊʹ͸ɺ
    ͦͷલʹ͋ΔจࣈΛ஌Δඞཁ͕͋Δɻ

    View Slide

  119. U+200D
    จࣈ ͺ a \r b &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+62 U+1F1EF U+1F1F5
    1 2 3 4 5
    N൪໨ͷจࣈΛ஌ΔͨΊʹ͸ɺ
    ͦͷલʹ͋ΔจࣈΛ஌Δඞཁ͕͋Δɻ

    N൪໨ͷจࣈΛऔಘ͢ΔͨΊͷܭࢉྔ͸O(N)

    View Slide

  120. U+200D
    จࣈ ͺ a \r b &
    Unicode

    Scalar
    U+306F U+309A U+61 U+0D U+62 U+1F1EF U+1F1F5
    1 2 3 4 5
    N൪໨ͷจࣈΛ஌ΔͨΊʹ͸ɺ
    ͦͷલʹ͋ΔจࣈΛ஌Δඞཁ͕͋Δɻ

    N൪໨ͷจࣈΛऔಘ͢ΔͨΊͷܭࢉྔ͸ O(N)

    View Slide

  121. ܭࢉྔ
    ܭࢉʹ͔͔Δ࣌ؒ
    จࣈͷҐஔ

    View Slide

  122. ܭࢉྔ
    ܭࢉʹ͔͔Δ࣌ؒ
    จࣈͷҐஔ
    O(N)

    View Slide

  123. String͸Collectionʹ४ڌ
    • ఴࣈΞΫηεͷܭࢉྔ͸O(1)Ͱͳ͍ͱ͍͚ͳ͍

    View Slide

  124. ܭࢉྔ
    ܭࢉʹ͔͔Δ࣌ؒ
    จࣈͷҐஔ
    O(N)

    View Slide

  125. ܭࢉྔ
    ܭࢉʹ͔͔Δ࣌ؒ
    จࣈͷҐஔ
    O(N)
    Collectionϓϩτίϧͷ
    ཁ੥

    View Slide

  126. ܭࢉྔ
    ܭࢉʹ͔͔Δ࣌ؒ
    จࣈͷҐஔ
    IntͰఴࣈΞΫηεͨ͠ͱ͖ʹ͔
    ͔Δ࣌ؒ O(N)
    Collectionϓϩτίϧͷ
    ཁ੥ O(1)

    View Slide

  127. ܭࢉྔ
    ܭࢉʹ͔͔Δ࣌ؒ
    จࣈͷҐஔ
    IntͰఴࣈΞΫηεͨ͠ͱ͖ʹ͔
    ͔Δ࣌ؒ O(N)
    Collectionϓϩτίϧͷ
    ཁ੥ O(1)
    String͸IntͰ͸ఴࣈΞΫηε
    Ͱ͖ͳ͍

    View Slide

  128. StringͷఴࣈΞΫηεʹ͍ͭͯ

    View Slide

  129. String.Index
    StringͷఴࣈΞΫηεʹ͍ͭͯ

    View Slide

  130. String.Index
    StringͷఴࣈΞΫηεʹ͍ͭͯ
    ࢝఺͔ΒͷΦϑηοτ

    View Slide

  131. ΞδΣϯμ
    - SwiftͷStringʹ͍ͭͯ

    - Unicodeʹ͍ͭͯ

    -Stringͱཁૉͷஔ͖׵͑ʹ͍ͭͯ

    View Slide

  132. ཁૉͷஔ͖׵͕͑Ͱ͖ͳ͍

    View Slide

  133. Array
    String
    "
    #

    View Slide

  134. Array
    String
    "
    #
    ఴࣈΞΫηεͰsetͰ͖Δ
    ఴࣈΞΫηεͰsetͰ͖ͳ͍

    View Slide

  135. Array
    String
    "
    #
    ఴࣈΞΫηεͰsetͰ͖Δ
    ఴࣈΞΫηεͰsetͰ͖ͳ͍
    MutableCollectionʹ४ڌ͍ͯ͠Δ
    MutableCollectionʹ४ڌ͍ͯ͠ͳ͍

    View Slide

  136. Array
    String
    "
    #
    ఴࣈΞΫηεͰsetͰ͖Δ
    ఴࣈΞΫηεͰsetͰ͖ͳ͍
    MutableCollectionʹ४ڌ͍ͯ͠Δ
    MutableCollectionʹ४ڌ͍ͯ͠ͳ͍

    View Slide

  137. Sequence
    Collection
    MutableCollection

    View Slide

  138. Sequence
    Collection
    MutableCollection
    - ఴࣈΞΫηεʹΑΔgetΛ
    ఆٛ
    - ఴࣈΞΫηεʹΑΔsetΛ
    ఆٛ

    View Slide

  139. Sequence
    Collection
    MutableCollection
    - ఴࣈΞΫηεʹΑΔgetΛ
    ఆٛ
    - ఴࣈΞΫηεʹΑΔsetΛ
    ఆٛ
    ܭࢉྔ͸O(1)
    ͲͪΒ΋ܭࢉྔ͸O(1)

    View Slide

  140. Sequence
    Collection
    MutableCollection
    String
    Sequence
    Collection
    MutableCollection
    Array

    View Slide

  141. Sequence
    Collection
    MutableCollection
    String
    Sequence
    Collection
    MutableCollection
    Array
    ఴࣈΞΫηεʹΑΔset
    ͕O(1)Ͱ࣮ݱͰ͖ͳ͍͔Β

    View Slide

  142. จࣈ ͏ a b c
    Unicode

    Scalar
    U+3046 U+61 U+62 U+63
    var string = “͏abc"
    string[string.startIndex] = "X"

    View Slide

  143. จࣈ ͏ a b c
    Unicode

    Scalar
    U+3046 U+61 U+62 U+63
    var string = “͏abc"
    string[string.startIndex] = "X"

    View Slide

  144. จࣈ X a b c
    Unicode

    Scalar
    U+58 U+61 U+62 U+63
    var string = “͏abc"
    string[string.startIndex] = "X"

    View Slide

  145. จࣈ ͏ a b c
    Unicode

    Scalar
    U+3046 U+61 U+62 U+63
    จࣈ X a b c
    Unicode

    Scalar
    U+58 U+61 U+62 U+63

    View Slide

  146. จࣈ ͏ a b c
    Unicode

    Scalar
    U+3046 U+61 U+62 U+63
    UTF-8 E3 81 85 61 62 63
    จࣈ X a b c
    Unicode

    Scalar
    U+58 U+61 U+62 U+63
    UTF-8 58 61 62 63

    View Slide

  147. จࣈ ͏ a b c
    Unicode

    Scalar
    U+3046 U+61 U+62 U+63
    UTF-8 E3 81 85 61 62 63
    จࣈ X a b c
    Unicode

    Scalar
    U+58 U+61 U+62 U+63
    UTF-8 58 61 62 63

    View Slide

  148. จࣈ ͏ a b c
    Unicode

    Scalar
    U+3046 U+61 U+62 U+63
    UTF-8 E3 81 85 61 62 63
    όΠτ෯ 3 1 1 1
    จࣈ X a b c
    Unicode

    Scalar
    U+58 U+61 U+62 U+63
    UTF-8 58 61 62 63
    όΠυ෯ 1 1 1 1

    View Slide

  149. View Slide

  150. 1όΠτ

    View Slide

  151. a b c
    ͏

    View Slide

  152. a b c
    ͏
    a b c
    X

    View Slide

  153. a b c
    ͏
    a b c
    X

    View Slide

  154. a c
    b
    ͏
    b c
    a
    X
    ೖΕସ͑ͨจࣈͷҎ߱ͷจࣈͷόΠτྻΛҠಈ͢Δඞཁ͕͋Δ

    ఴࣈΞΫηεʹΑΔ set ͷܭࢉྔ͸O(N)

    View Slide

  155. ·ͱΊ
    - ҰͭͷCharacterͷ಺෦දݱ͕ͦΕͧΕҟͳΔͷͰɺ
    CharacterͷऔಘͱೖΕସ͑ͷܭࢉྔ͕O(1)ʹͳΒͳ͍
    - IntͰఴࣈΞΫηεͰ͖ͳ͍
    - MutableCollectionʹ४ڌ͠ͳ͍

    View Slide