SlideShare a Scribd company logo
1 of 24
Download to read offline
Strings and Characters
in Swift
Goichi Hirakawa
自己紹介
• 平川 剛一 (Goichi Hirakawa)
• @gooichi
• OS X / iOSプログラマ
• Objective-C歴XX年…
アジェンダ
• String型の特徴
• String型の構造
• String型の初期化
• String型の等価性
String型の特徴
• Unicode規格に正確(Unicode-Correct)
• ロケール非依存(Local-Insensitive)
• 値型(Value Type)
• 4つのビュー(Views)
• Objective-Cブリッジ(Objective-C Bridge)
Unicode規格に正確
• Swift文字列はUnicode規格に正確に設計
• 文字符号化形式:UTF-8、UTF-16、UTF-32
• 例えば、等価演算子 == は正準等価をチェック
ロケール非依存
• Swift文字列の基本的な操作はロケール非依存
• 常に基本的な文字列操作のためのデフォルトの
Unicodeアルゴリズムを使用
• ロケール依存の操作にはNSStringのAPIが必要
値型
• 各文字列変数、let束縛、保存されたプロパティは
独立した値を持つ
• Copy-on-Write:変更時にデータコピー
4つのビュー
• CharacterView
• UnicodeScalarView
• UTF16View
• UTF8View
Objective-Cブリッジ
• NSStringとしてObjective-Cへブリッジ
• 任意のNSStringのサブクラスがStringになれる
• NSString→Stringは明示的キャスト必要(1.2∼)
• 表現や効率に保証はない
String型の構造
• String型はそれ自体、何のコレクションでもない
• 意味のあるコレクションとして文字列の内容を提示するプロパティを持つ:
• characters: Character(拡張書記素クラスタ)のコレクション
• unicodeScalars: UnicodeScalar(Unicodeスカラ)のコレクション
• utf16: UTF16.CodeUnit(UTF-16のコード単位)のコレクション
• utf8: UTF8.CodeUnit(UTF-8のコード単位)のコレクション
• NSStringオブジェクトは 概念的には プラットフォームエンディアンのUTF-16


→ 文字列の長さ、文字インデックス、範囲がUTF-16の単位で表現
Unicode用語
• コードポイント(Code Point)
• Unicodeコード空間の任意の値; すなわち0から10FFFF(21-bit)
• コード単位(Code Unit)
• 符号化されたテキストの単位を表現する最小bitの組み合わせ
• Unicodeスカラ(Unicode Scalar)= SwiftのUnicodeScalar
• 上位/下位サロゲートペアのコードポイントを除く任意のコードポイント
• 具体的には、0∼D7FFとE000∼10FFFF
• UTF-32と同じ
• 拡張書記素クラスタ(Extended Grapheme Cluster)= SwiftのCharacter
• 人が読める単一の文字を生成する1つ以上のUnicodeスカラのシーケンス
ビューサンプル
Dog‼🐶
Character
D
U+0044
o
U+006F
g
U+0067
‼
U+203C
🐶
U+1F436
Unicode
Scalar
(UTF-32)
コード
単位
0x44 0x6F 0x67 0x203C 0x1F436
位置 0 1 2 3 4
UTF-16
コード
単位
0x44 0x6F 0x67 0x203C 0xD83D 0xDC36
位置 0 1 2 3 4 5
UTF-8
コード
単位
0x44 0x6F 0x67 0xE2 0x80 0xBC 0xF0 0x9F 0x90 0xB6
位置 0 1 2 3 4 5 6 7 8 9
String型の初期化
• Character(s)
• UnicodeScalar(s)
• UTF16View
• UTF8View
• Number, Streamable, CustomStringConvertible,
CustomDebugStringConvertible, etc…
• NSString
String型の等価性
• 文字列や文字の等価性
• NSStringクラスの等価性
• CJK統合漢字とCJK互換漢字
• 異体字セレクタ
文字列や文字の等価性
• 等価演算子(==)と非等価演算子(!=)で確認
• String / Character共に拡張書記素クラスタが

正準等価 の場合に等しいとみなす
• ロケールに依存しない
Unicodeの等価性
• 正準等価(Canonical Equivalent)
• 異なるUnicodeスカラでも同じ言語的意味と外観を持つ

拡張書記素クラスタ
• 例)U+00E9 ( é ) == U+0065 ( e ) + U+0301 ( ́ )
• 互換等価(Compatibility Equivalent)
• 正準等価より更に広い範囲を等価とみなす弱い等価性
• フォント、改行、丸囲み、幅、回転、上付き下付き、組文字、分数等々
• 例)U+2460 ( ① ) == U+0031( 1 )
NSStringクラスの等価性
• -isEqualToString:はUTF-16の文字単位で比較
• NSStringオブジェクトに等価演算子( == )を使
うと-isEqual:経由で-isEqualToString:が呼ばれる
• compare:関連メソッドは正準/互換表現で比較
(Undocumented、詳細不明)
等価性サンプル (1)
• Swift
let string1 = "u{E9}" // é
let string2 = "u{65}u{301}" // e + ́
print(string1 == string2) // true
• Objective-C
let nsString1: NSString = string1
print(nsString1 == string2) // false
print(nsString1.isEqualToString(string2)) // false
print(nsString1.compare(string2)
== NSComparisonResult.OrderedSame) // true
CJK統合漢字とCJK互換漢字
• CJK統合漢字
• Unicodeの符号化用漢字集合
• 中国、日本、韓国、ベトナムで共通して使われる
• CJK互換漢字
• 国ごとの既存の文字コードとの互換性のための領域
• 日本ではIBM拡張文字やJIS X 0213の旧字体など
• 一部を除き、同じ字源の漢字がCJK統合漢字に含まれる
• それらのCJK統合漢字とは 正準等価 (正規化で置換)
等価性サンプル (2)
• 塚 と (外観が異なるが互換漢字)
let unifiedKanji = "u{585A}" // 塚
let compatiKanji = "u{FA10}" //
print(unifiedKanji == compatiKanji) // true
• 崎 と (互換漢字ではなく統合漢字)
let unifiedKanji = "u{5D0E}" // 崎
let nonCompatiKanji = "u{FA11}" //
print(unifiedKanji == nonCompatiKanji) // false
異体字セレクタ
• IVS: Ideographic Variation Sequence/Selector
• 文字の字形をより詳細に指定する選択子
• それぞれの文字コードの後に選択子を追加
• 統合された異体字を区別するために追加
• 正規化の影響を受けない( 正準等価 でない)
漢字コードサンプル
塚 と (それ以外の関連字は省略)
種類 コードシーケンス 表示
CJK統合漢字 U+585A 塚
CJK互換漢字 U+FA10
IVS
U+585A U+E0100 ※1
U+585A U+E0103 ※2
塚
U+585A U+E0101 ※1
U+585A U+E0105 ※2
標準異体字 ※3 U+585A U+FE01 塚
U+585A U+FE00
※1 アドビシステムズが Adobe-Japan1 で登録
※2 汎用電子が Hanyo-Denshi で登録
※3 Unicode標準で命名し定義、IVSとの違いはない
等価性サンプル (3)
• CJK統合漢字とCJK互換漢字のみ等価
let unifiedKanji = "u{585A}" // 塚
let compatiKanji = "u{FA10}" //
print(unifiedKanji == compatiKanji) // true
• それ以外の組み合わせはすべて非等価
• IVS同士でも異体字セレクタが異なれば非等価

(Adobe-Japan1とHanyo-Denshiは非互換)
let adobeKanji = "u{585A}u{E0100}" // 塚
let hanyoKanji = "u{585A}u{E0103}" // 塚
print(adobeKanji == hanyoKanji) // false
まとめ
• String型の特徴、構造、初期化、等価性について
• 等価性については、NSStringとの相違点、Unicodeの仕様、

特に漢字コードには注意(問題はSwiftではなくUnicodeの仕様…)
• Swift 2でもNSString APIはもちろん必要
• ロケールに依存する処理
• 正規化
• 検索、正規表現
• 等々

More Related Content

Viewers also liked

Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムYuichi Yoshida
 
プロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftプロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftTomohiro Kumagai
 
NS Prefix 外伝 … Copy-On-Write #関モバ
NS Prefix 外伝 … Copy-On-Write #関モバNS Prefix 外伝 … Copy-On-Write #関モバ
NS Prefix 外伝 … Copy-On-Write #関モバTomohiro Kumagai
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumTomohiro Kumagai
 
AWS Cognitoを実際のアプリで導入してハマったこと
AWS Cognitoを実際のアプリで導入してハマったことAWS Cognitoを実際のアプリで導入してハマったこと
AWS Cognitoを実際のアプリで導入してハマったこと洋一郎 櫻井
 
Swift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDCSwift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDCTomohiro Kumagai
 
AnyObject – 自分が見落としていた、基本の話
AnyObject – 自分が見落としていた、基本の話AnyObject – 自分が見落としていた、基本の話
AnyObject – 自分が見落としていた、基本の話Tomohiro Kumagai
 
OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた徹 上野山
 
GANMA!でDDDをやってみてから1年くらい経った
GANMA!でDDDをやってみてから1年くらい経ったGANMA!でDDDをやってみてから1年くらい経った
GANMA!でDDDをやってみてから1年くらい経ったYasuyuki Sugitani
 
Swift イニシャライザー復習会 #love_swift #akibaswift #21cafe
Swift イニシャライザー復習会 #love_swift #akibaswift #21cafeSwift イニシャライザー復習会 #love_swift #akibaswift #21cafe
Swift イニシャライザー復習会 #love_swift #akibaswift #21cafeTomohiro Kumagai
 

Viewers also liked (13)

Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
プロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftプロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswift
 
NS Prefix 外伝 … Copy-On-Write #関モバ
NS Prefix 外伝 … Copy-On-Write #関モバNS Prefix 外伝 … Copy-On-Write #関モバ
NS Prefix 外伝 … Copy-On-Write #関モバ
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
 
AWS Cognitoを実際のアプリで導入してハマったこと
AWS Cognitoを実際のアプリで導入してハマったことAWS Cognitoを実際のアプリで導入してハマったこと
AWS Cognitoを実際のアプリで導入してハマったこと
 
Swift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDCSwift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDC
 
AnyObject – 自分が見落としていた、基本の話
AnyObject – 自分が見落としていた、基本の話AnyObject – 自分が見落としていた、基本の話
AnyObject – 自分が見落としていた、基本の話
 
OpenCVの基礎
OpenCVの基礎OpenCVの基礎
OpenCVの基礎
 
OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた
 
GANMA!でDDDをやってみてから1年くらい経った
GANMA!でDDDをやってみてから1年くらい経ったGANMA!でDDDをやってみてから1年くらい経った
GANMA!でDDDをやってみてから1年くらい経った
 
Ddd × 新人教育
Ddd × 新人教育Ddd × 新人教育
Ddd × 新人教育
 
Swift イニシャライザー復習会 #love_swift #akibaswift #21cafe
Swift イニシャライザー復習会 #love_swift #akibaswift #21cafeSwift イニシャライザー復習会 #love_swift #akibaswift #21cafe
Swift イニシャライザー復習会 #love_swift #akibaswift #21cafe
 
OpenCV 3.0 on iOS
OpenCV 3.0 on iOSOpenCV 3.0 on iOS
OpenCV 3.0 on iOS
 

Similar to Strings and Characters in Swift

JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成Akineko Shimizu
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってますmametter
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミングNet Penguin
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3Masahiro Wakame
 

Similar to Strings and Characters in Swift (8)

JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 

More from Goichi Hirakawa

Strings and characters in swift
Strings and characters in swiftStrings and characters in swift
Strings and characters in swiftGoichi Hirakawa
 
Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)Goichi Hirakawa
 
New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0Goichi Hirakawa
 
Objective-C Generics LT version
Objective-C Generics LT versionObjective-C Generics LT version
Objective-C Generics LT versionGoichi Hirakawa
 
Mix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-CMix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-CGoichi Hirakawa
 

More from Goichi Hirakawa (9)

Strings and characters in swift
Strings and characters in swiftStrings and characters in swift
Strings and characters in swift
 
WebKit Overview
WebKit OverviewWebKit Overview
WebKit Overview
 
Server-side Swift
Server-side SwiftServer-side Swift
Server-side Swift
 
Swift Type System
Swift Type SystemSwift Type System
Swift Type System
 
Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)
 
New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0
 
Objective-C Generics
Objective-C GenericsObjective-C Generics
Objective-C Generics
 
Objective-C Generics LT version
Objective-C Generics LT versionObjective-C Generics LT version
Objective-C Generics LT version
 
Mix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-CMix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-C
 

Strings and Characters in Swift