Slide 1

Slide 1 text

ʮจࣈ਺ʯͬͯͳ͊ʹʁ ʙString, NSString, Unicodeͷجຊʙ by takasek 2016/11/16 ୈ5ճελʔτΞοϓiOSษڧձ 1

Slide 2

Slide 2 text

2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

݁࿦ ࠓ೔͸͜Ε͚͍֮ͩ͑ͯͩ͘͞ 4 String ͱ NSString ͸ผ෺ 4 Range ͱ NSRange ΋ผ෺ 4 Cocoaੈք͕ؔΘΔจࣈྻૢ࡞͸ɺඞͣ NSString ͷAPIΛ௨͠·͠ΐ͏ 4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

ਖ਼͍͠ range͕ ࡞Εͳ͍! 7

Slide 8

Slide 8 text

String ͱ NSString Կ͕ҧ͏ʁ 4 struct ͱ class? 4 Swift ͱ Obj-C? 8

Slide 9

Slide 9 text

String ͱ NSString Կ͕ҧ͏ʁ 4 struct ͱ class? 4 Swift ͱ Obj-C? ͦΕҎ্ʹॏཁͳҧ͍͕͋Γ·͢ 9

Slide 10

Slide 10 text

String ͱ NSString Կ͕ҧ͏ʁ 4 NSString 4 ಺෦తʹ͸UTF-16ͰόΠτྻΛอ࣋ 4 UTF-16ͷόΠτྻΛૢ࡞͢ΔͨΊͷAPIΛఏڙ 4 String 4 ಺෦ͷόΠτྻ͸Ӆṭ 4 จࣈྻૢ࡞ͷͨΊʹɺॻهૉΫϥελ͓Αͼ֤छ UnicodeͷίʔυϢχοτͷViewΛఏڙ͍ͯ͠Δ 10

Slide 11

Slide 11 text

!ʮ❓❓❓ʯ 11

Slide 12

Slide 12 text

View? ॻهૉΫϥελ?? ֤छUnicodeͷ ίʔυϢχοτ??? 12

Slide 13

Slide 13 text

!ʮ…ʯ 13

Slide 14

Slide 14 text

Unicodeͱ͸ 1 ූ߸Խจࣈू߹΍จࣈූ߸ԽํࣜͳͲΛఆΊͨɺ จࣈίʔυͷۀքن֨Ͱ͋Δɻ จࣈू߹͕୯Ұͷେن໛จࣈηοτͰ͋Δ͜ͱ ʢʮUniʯͱ͍͏໊͸ͦΕʹ༝དྷ͢Δʣ ͳͲ͕ಛ௃Ͱ͋Δɻ 1 ग़య: https://ja.wikipedia.org/wiki/Unicode 14

Slide 15

Slide 15 text

ͭ·Γʁ 4 21bitͷ੔਺஋ۭؒʢίʔυۭؒʣ Λ༻ҙ 4 ੔਺஋ʹจࣈΛׂΓ౰ͯ(ූ߸Խ) 4 ׂΓ౰ͯΒΕͨ஋ΛɺίʔυϙΠϯτͱݺͿ 15

Slide 16

Slide 16 text

16

Slide 17

Slide 17 text

4 ίʔυϙΠϯτ͸ U+(16ਐ਺) Ͱදݱ͢Δ 4 BMP ʢجຊଟݴޠ໘ʣ = U+0000 ʙ U+FFFF 4 SMP ʢ௥Ճ໘ʣ = U+10000 ʙ ͔͠͠… 21bitͷίʔυۭؒΛɺ Ͳ͏΍࣮ͬͯࡍͷόΠτྻͱͯ͠ දݱ͢Δ͔ʁ 17

Slide 18

Slide 18 text

ΤϯίʔσΟϯά ཁ͸ɺಛఆͷίʔυϙΠϯτΛදݱ͢ΔͨΊͷ ࠷খ୯Ґ(ίʔυϢχοτ)ΛԿbitʹ͢Δ͔ɺͱ͍͏࿩ɻ ಉ͡ίʔυϙΠϯτͰ΋ɺόΠτྻදݱʹ͸όϦΤʔγϣϯ͕͋Δɻ2 2 ਤͷग़య: http://www.unicode.org/versions/Unicode6.2.0/ch02.pdf 18

Slide 19

Slide 19 text

UTF-32 4 1ίʔυϢχοτ = 32bit(4όΠτ) 4 1ίʔυϙΠϯτ = 4όΠτͷݻఆ௕ ※ίʔυϢχοτ(32bit)͕ίʔυۭؒ(21bit)ΑΓେ͖͍ͷͰɺݻఆ௕ʹͰ͖ Δ 19

Slide 20

Slide 20 text

UTF-16 4 1ίʔυϢχοτ = 16bit(2όΠτ) 4 1ίʔυϙΠϯτ = 2όΠτ or 4όΠτͷՄม௕ ※Unicode 1.0.0ͷࠒ͸ɺ͜ͷൣғ಺ʹੈքதͷจࣈ͕ऩ·Δ૝ఆͩͬͨΜ͚ͩ Ͳ… 20

Slide 21

Slide 21 text

UTF-8 4 1ίʔυϢχοτ = 8bit(1όΠτ) 4 1ίʔυϙΠϯτ = 1όΠτʙ4όΠτͷՄม௕ 21

Slide 22

Slide 22 text

!ʮͤΜͤʔʯ 22

Slide 23

Slide 23 text

!ʮίʔυϙΠϯτͱ͔ ݴΘΕͯ΋ ෼͔ΓͮΒ͍ΜͰ͚͢Ͳʯ 23

Slide 24

Slide 24 text

!ʮཁ͸ɺ ίʔυϙΠϯτ = 1จࣈ ͬͯ͜ͱͰ͢ΑͶʯ 24

Slide 25

Slide 25 text

!ʮͱɺ ࢥ͏͡ΌΜʁʯ 25

Slide 26

Slide 26 text

ந৅จࣈ(abstract character) 4 ਓ͕ؒࢥ͍ඳ͘ʮจࣈʯ 4 ΧʔιϧΩʔͷҠಈ୯Ґ ɹͱߟ͑Δͱ͍͍ 4 ந৅จࣈͱූ߸Խจࣈ͸ ɹ ଟରଟ ͷؔ܎ 26

Slide 27

Slide 27 text

͞ΒʹɺίʔυϙΠϯτʹ͸૊Έ߹Θͤͯ࢖͏΋ͷ΋ = ॻهૉΫϥελ (grapheme cluster)3 3 ग़య: Unicodeͱ͸ʁ ͦͷྺ࢙ͱਐԽɺ։ൃऀ޲͚جૅ஌ࣝ http://www.buildinsider.net/language/csharpunicode/01 27

Slide 28

Slide 28 text

·ͱΊ 4 ந৅จࣈͷ࡞Γ͔ͨ 4 ίʔυۭؒ(21bit)಺ʹίʔυϙΠϯτ͕͋ΔͷͰɺ 4 ׂΓ౰ͯΒΕͨූ߸Խจࣈ , Λ૊Έ߹Θͤͯ 4 ந৅จࣈ / ॻهૉΫϥελ Λ࡞Δ 4 ΤϯίʔσΟϯάͱ͸ 4 ಛఆͷ ίʔυϙΠϯτ (࠷େ21bit)Λ 4 نఆαΠζͷ ίʔυϢχοτ (8bit / 16bit / 32bit) ʹ٧Ίࠐ Ήํ๏ 28

Slide 29

Slide 29 text

༨ஊ άϦϑ(glyph)ͱ͍͏·ͨผͷ֓೦΋͋Δ 4 จࣈͷݟͨ໨ʢҐஔɺαΠζʣͷ৘ใ 4 จࣈ͸ඞͣࠨ͔ΒӈʹྲྀΕΔΘ͚͡Όͳ͍ Ͱ͠ΐɺͬͯ͜ͱ 4 CoreTextͰ؅ཧ͞ΕΔ…ͷ͚ͩͲɺࠓճ͸ল ུ 29

Slide 30

Slide 30 text

ͱ΋͋Εɺ StringͷAPI͕ཧղͰ͖ͨ 30

Slide 31

Slide 31 text

܁Γฦ͢ͱɺ Swift.String͸ɺॻهૉΫϥελ͓Αͼ ֤छUnicodeͷίʔυϢχοτͷView Λఏڙ͍ͯ͠Δ 4 String.CharacterView 4 String.UnicodeScalarView 4 String.UTF8View 4 String.UTF16View 31

Slide 32

Slide 32 text

let str = "\u{41}\u{3A9}\u{8A9E}\u{10384}" str.characters.count //4 !ॻهૉΫϥελ str.unicodeScalars.count // 4 !UTF-32ͰͷίʔυϢχοτ਺ str.utf16.count // 5 !UTF-16ͰͷίʔυϢχοτ਺ str.utf8.count // 10 !UTF-8ͰͷίʔυϢχοτ਺ 32

Slide 33

Slide 33 text

String.CharacterView͸ ڧ͍ ߹ࣈ΋equalͰ൑ผͯ͘͠ΕΔ let cafe1 = "Cafe\u{301}" let cafe2 = "Café" print(cafe1 == cafe2) // true 33

Slide 34

Slide 34 text

ͨͩɺ෺ʹΑͬͯ͸1จࣈͱͯ͠ೝࣝ͞Εͳ͍͜ͱ ΋͋Δ "!".characters.count // 4 34

Slide 35

Slide 35 text

Unicodeͷ ϧʔϧ΍ จࣈ͸ɺ ૿͑Δɻ ͭ·Γ ʮ1จࣈʯͷ൑அ͸؀ڥґଘ 4 4 Unicodeͱ͸ʁ ͦͷྺ࢙ͱਐԽɺ։ൃऀ޲͚جૅ஌ ࣝ - Build Insider http://www.buildinsider.net/ language/csharpunicode/01 35

Slide 36

Slide 36 text

͍ͣΕʹͤΑɺ SwiftͷString API͸ Α͘ߟ͑ΒΕ͍ͯ· ͢ɻ 36

Slide 37

Slide 37 text

ͬͯ͜ͱͰ NSStringͷ͜ͱ͸ ΋͏๨Εͯ Swift.Stringͱָ͘͠ աͯ͝͠Լ͍͞! 37

Slide 38

Slide 38 text

͓ΘΓ 38

Slide 39

Slide 39 text

…͡Όͳ͍ɻ 39

Slide 40

Slide 40 text

40

Slide 41

Slide 41 text

NSAttributedTextɾ UITextView ʮ΍͊!ʯ 41

Slide 42

Slide 42 text

ʮFoundationʹࠜΛԼΖ͠ NSStringͱڞʹੜ͖Α͏ʯ © 1986 Studio Ghibliʗఱۭͷ৓ϥϐϡλ 42

Slide 43

Slide 43 text

ͲΜͳʹྑ͘ઃܭ͞Εͨ ValueTypeΛ࡞ͬͯ΋ɺ Cocoa͔Β཭Εͯ͸ ੜ͖ΒΕͳ͍ͷΑʂ © 1986 Studio Ghibliʗఱۭͷ৓ϥϐϡλ 43

Slide 44

Slide 44 text

NSString͸ UTF-16 ॻهૉΫϥελͱ͸Χ΢ϯτ͕ҟͳΔ let flag = "\u{1F1EF}\u{1F1F5}" // "!" flag.characters.count // 1 "ॻهૉΫϥελ͸ 1 flag.unicodeScalars.count // 2 "ίʔυϙΠϯτ2ݸ flag.utf16.count // 4 "2ίʔυϙΠϯτ × 2ίʔυϢχοτ flag.utf8.count // 8 "2ίʔυϙΠϯτ × 4ίʔυϢχοτ (flag as NSString).length // 4 "utf16.countͱҰக 44

Slide 45

Slide 45 text

͡Ό͋ String.utf16 Λ࢖͑͹ ͍͍ʁ ͦΕ͸Ͳ͏ͩΖ͏… 4 ͨͱ͑ String.utf16 ͱޓ׵ੑ͕͋Δͱͯ͠΋ɺ Range → NSRange ͷม׵͸ਏ͍ 4 String.Index Λ Int ʹม׵͢Δͷखؒͩ͠…5 4 ͱ͍͏͔ɺͦ͜ͰϛεΛ൜ͨ͘͠ͳ͍ 5 ͋͑ͯͦ͏͍͏σβΠϯʹͳ͍ͬͯΔཧ༝Λߟ͑Δࢀߟهࣄ Swift 3ͷStringͷViewʹରͯ͠ɺIntͰsubscriptग़དྷͳ͍ཧ༝ – SwiftɾiOSίϥϜ – Medium https://medium.com/swift-column/swift-string-7147f3f496b1#.x1n3vrh1p 45

Slide 46

Slide 46 text

ͩͬͨΒɺ࠷ॳ͔Β΋͏ CocoaͷੈքͰॲཧΛดͨ͡ ΄͏͕ྑ͍Ͱ͢Ͷ 46

Slide 47

Slide 47 text

❌ let range = str.range(of: target)! // Range Λ NSRange ʹม׵ let nsRange = NSRange( location: str.distance(from: str.startIndex, to: range.lowerBound), length: target.characters.count ) ⭕ let nsStr = NSString(string: str) // Ұ౓NSStringͷੈքʹೖΕ͹… let nsRange = nsStr.range(of: target) // RangeΛհ͞ͳ͍ͷͰɺม׵ॲཧෆཁ 47

Slide 48

Slide 48 text

48

Slide 49

Slide 49 text

49

Slide 50

Slide 50 text

! 50

Slide 51

Slide 51 text

΋͏Ұ౓ɺࠓ೔ͷ݁࿦ 4 String ͱ NSString ͸ผ෺ 4 Range ͱ NSRange ΋ผ෺ 4 Cocoaੈք͕ؔΘΔจࣈྻૢ࡞͸ɺඞͣ NSString ͷAPIΛ௨͠·͠ΐ͏ 4 ͋ͱɺ࢓༷ʹʮจࣈ਺ΛΧ΢ϯτͯ͠Ӡʑʯ͕ ग़͖ͯͨΒ਎ߏ͑·͠ΐ͏ 51

Slide 52

Slide 52 text

ࢀߟϦϯΫ Unicode ͷαϩήʔτϖΞͱ͸Կ͔ - ͻͩ·Γιέοτ͸յΕͳ͍ http://vividcode.hatenablog.com/entry/unicode/surrogate-pair ͳͥSwiftͷจࣈྻAPI͸೉͍͠ͷ͔ | ϓϩάϥϛϯά | POSTD http://postd.cc/why-is-swifts-string-api-so-hard/ Unicodeͱ͸ʁ ͦͷྺ࢙ͱਐԽɺ։ൃऀ޲͚جૅ஌ࣝ - Build Insider http://www.buildinsider.net/language/csharpunicode/01 UnicodeͱɺC#Ͱͷจࣈྻͷѻ͍ - Build Insider http://www.buildinsider.net/language/csharpunicode/02 Swift 3ͷStringͷViewʹରͯ͠ɺIntͰsubscriptग़དྷͳ͍ཧ༝ – SwiftɾiOSίϥϜ – Medium https://medium.com/swift-column/swift-string-7147f3f496b1#.x1n3vrh1p 52