iBooks にある “The Swift Programming Language” の勉強メモ。Objective-C と C を普段書いている自分から、ちょっと馴染みがないものを特にまとめておきます。目次は こちら。
今回は、String と Character に関して。
Strings and Characters
1. String は value (値)
Swing は Cocoa の NSString と違い、String は全て値であり、コピーして関数に渡され、新しく代入された際にも、常に新しいコピーが作られる。Cocoa では、常に * を使用するように、基本的に、reference が渡されていた。渡された文字列が、called func の中でいじられないということを保証することができる。
2. Character type
String は順序のある Character type の集まり。だた一つの Character を作成するには、下記のように明示的に Character を書く。
1 | let yenSign: Character = "¥" |
3. 文字列の長さ
文字列の長さを得るには、countElemetns というグローバル関数を使う。Swift では、英語でない言語や、絵文字をサポートしているので、文字によって、一つ一つの文字が異なるメモリ容量を持っています。そのため、文字列の長さを得るには、C のように始まりと終わりのポインタの差を返すといった単純なものではなく、文字列の各文字を全てチェックする必要があります。長い文字列を処理する際には、注意。
1 2 3 | let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪" println("unusualMenagerie has \(countElements(unusualMenagerie)) characters") // unusualMenagerie has 40 characters |
Objective-C の NSString の length プロパティと countElements が返す値は異なることがあります。NSString の length は 16bits コードに基づいているためです。Swift で NSString の length にアクセスする場合には、utf16count というものが使われます。
4. 文字列比較 (hasPrefix / hasSuffix)
hasPrefix と hasSuffix という文字列比較のメソッドがある。コードを見た方がわかりやすいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | let fullName = [ "Kobayashi Kazuya", "Kobayashi Taro", "Suzuki Kazuya", "Suzuki Taro" ] var numKobayashi = 0 for name in fullName { if name.hasPrefix("Kobayashi") { ++numKobayashi } } println("\(numKobayashi) Kobayashi here!") // 2 var numKazuya = 0 for name in fullName { if name.hasSuffix("Kazuya") { ++numKazuya } } println("\(numKazuya) Kazuya here!") // 2 |