Swift 2における文字列

2016. 02. 09
この記事は「Apple Developer/Swift Blog/Strings in Swift 2」の翻訳ですが、素人翻訳ゆえ内容は保証しかねますのでご留意ください。



Swiftはその標準ライブラリの一部として、高性能なUnicode準拠の文字列の実装を提供します。
以前のStringは配列に類似したCharacter値のコレクションでしたが、Swift 2におけるString型はCollectionTypeプロトコルに準拠していません。
現在Stringは文字のコレクションビューを公開するcharactersプロパティを提供しています。

何故変更したのか?
文字列を文字のコレクションとしてモデル化するのが自然に思えますが、String型はArray、Set、またはDictionaryのようなコレクション型とは全く異なる動作をします。
このこと(文字列は文字のコレクション)は常に真ではありますが、Swift 2ではプロトコルの拡張に加えこれら(他のコレクション)と相違点に必要となるいくつかの基本的な変更を加えました。


部品の組み合わせとは異なる

コレクションに要素を追加する際、コレクションがその要素を含んでいることを想定するでしょう。
つまり配列に値を追加する時、配列にその値が含まれているというようにです。
辞書やセットにも同じことが言えます。
しかし文字列に組み合わせる記号文字を追加すると、文字列自体の内容が変更されます。

c、a、f、そしてeの四文字からなる文字列cafeについて考えてみましょう。

var letters: [Character] = ["c", "a", "f", "e"]
var string: String = String(letters)

print(letters.count)        // 4
print(string)        // cafe
print(string.characters.count)        // 4

組み合わせのアキュートアクセント文字 U+0301 ´ を追加すると文字列はまだ四文字ですが、最後の文字はéとなります。

let acuteAccent: Character = "\u{0301}"        // ´ COMBINING ACUTE ACCENT' (U+0301)

string.append(acuteAccent)
print(string.characters.count)        // 4
print(string.characters.last!)        // é

文字列のcharactersプロパティには元の小文字のeが含まれておらず、そして追加された組み合わせのアキュートアクセント ´ も含まれていません。
代わりに文字列にはアキュートアクセントを伴った小文字の"e"である é が含まれています。

string.characters.contains("e")        // false
string.characters.contains("´")        // false
string.characters.contains("é")        // true

他のコレクションのように文字列を処理をすると、セットにUIColor.redColor()UIColor.greenColor()を追加した後にセットを調べたらUIColor.yellowColor()が含まれていたというくらい、この結果には驚くことでしょう。


その文字の中身によって判断する

文字列とコレクションのもう一つの違いは、それらの等価性を決定する方法です。
  • 二つの配列は、双方が同じ要素数を持ち、対応しているインデックスの各要素のペアが同じ場合のみ等しい。
  • 二つのセットは、双方が同じ要素数を持ち、最初のセットに含まれている各要素が二つ目にも含まれている場合のみ等しい。
  • 二つの辞書は、それらがキーと値のペアからなる同じセットを持っている場合のみ等しい。

ただしStringは正準等価になることを基礎として等価性を決定します。
たとえ舞台裏で異なるUnicodeのスカラで構成された場合でも、同じ言語的意味と外観を持っている場合は、その文字は正準等価です。

個々の子音と母音を表す24の字または字母から成る韓国の書記体系を考えてみます。
これらの字が書き出された場合、各音節用に文字が結合されます。
例えば文字“가” ([ga])は、字“ᄀ” ([g])と“ᅡ” [a]から構成されています。
Swiftでは分解されたか合成されたかという文字の構成順序に関わらず、文字列は等しいと考えます。
(編注:ここではletterを字、characterを文字と訳しています)

let decomposed = "\u{1100}\u{1161}"        // ᄀ + ᅡ
let precomposed = "\u{AC00}"        // 가

decomposed == precomposed        // true

この場合も、動作はSwiftのコレクション型のいずれとも大きく異なります。
値 🐟 と 🍚 を持つ配列が 🍣 と等しいとみなされるくらい驚くべきことです。


貴方の視点に依存する

文字列はコレクションではありません。
しかしCollectionTypeに準拠したビューを提供します。

上記の例の単語“café”は分解された文字 [ c, a, f, e ] と [ ´ ] で構成されていますが、これは様々な文字列ビューから成っています。

 Character c a f é
 Unicodeスカラ値 c a f e ´
 UTF-8符号単位 99 97 102 101 204 129
 UTF-16符号単位 99 97 102 101 769

  • charactersプロパティは拡張書記素クラスタのテキストに分割しますが、これらはユーザが知覚する文字(この場合 c、a、f、そして é ) の近似値です。
    文字列は文字の境界を決定するために、文字列全体の中でのそれぞれの位置(各位置は符号位置と呼ばれます)を反復しなければならないので、このプロパティへのアクセスは線形の O(n) 時間で実行されます。
    人間が読めるテキストを含む文字列を処理する場合、例えば localizedStandardCompare(_:) メソッドや localizedLowercaseString プロパティで使用されるような、高レベルなロケール依存Unicodeアルゴリズムは、文字単位の処理が適切です。
  • unicodeScalarsプロパティは文字列に格納されている基礎スカラ値を取り出します。
    元の文字列が分解された e + ´ の代わりに合成済み文字 é で生成された場合、Unicodeスカラビューによって反映されます。
    文字データの低レベル操作を実行する場合はこのAPIを使用してください。
  • utf8とutf16プロパティは、それぞれUTF–8とUTF–16を表現するための符号位置を提供します。
    これらの値は特定のエンコーディングから変換された時に、ファイルに書き込まれる実際のバイトに対応しています。
    UTF-16符号単位が文字列長とオフセットを表すためにCocoaとCocoa Touchで使用されているのに対し、UTF-8符号単位は多くのPOSIX文字列処理APIで使用されています。

Swiftでの文字列や文字の処理についての詳細はSwift Programming LanguageSwift Standard Library Referenceを参照してください。



Apple Developer/Swift Blog/Strings in Swift 2

Wikipedia/Unicodeの等価性

Wikipedia/文字

Unicode Terminology: English - Japanese

XCode 5.1 日本語化計画/Swift 2 での String

Second Flush/CombiningとComposition

0 CommentsPosted in Swift






Bose SoundSport wireless headphones
Calendar
02 | 2017/03 | 03
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
Recent Articles
iTunes


Swift
Categories
Tips
WACOM


Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
BOSE

Bose SoundSport wireless headphones
ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
SQLite
OpenGL ES
Amazon


Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Profile

Author:水月杏香
永遠の初心者プログラマ。

QR Code
QR
Visitors