Swiftにおける文字[列]?
ずいぶんと前置きが長くなりました。それではSwiftの文字を実際に見てみましょう。次のコードをplaygroundかREPLで実行してみてください
var str = "Swift"
str += "スウィフト"
str = "\(str)"
let = str
print()
Swiftスウィフト
とprintされたはずです。たった5行のコードでも,
- 型宣言は不要。リテラルから適切に推論される
- ちなみに型の名前は
String
。Xcodeなら識別子をoption+click
すれば確認できる - 文字列リテラルは
""
で囲まれた内部 \()
で変数展開(interpolation) - 識別子
(identifier) にASCII以外のUnicodeを用いることもできる
もっともこのレベルのサポートは,
let me = "だん"
let me2 = "\u{3060}\u{3093}"
let nfd = "\u{305f}\u{3099}\u{3093}"
me == me2
me == nfd
me == me2
がtrue
なのは当然としても,me ==nfd
までもtrue
になるのです。なぜ等しいか?
ひらがなのfunc ==(_:String,_:String)->Bool
)
文字とは何か? 等しい文字とは何か? 文字列を文字にバラして見てみましょう。
for c in "\u{305f}\u{3099}\u{3093}".characters {
print(c, String(c).unicodeScalars.count, String(c).utf8.count)
}
結果は次のとおりになるはずです。
だ 2 6
ん 1 3
SwiftにおけるCharacter
は,
これはある意味,"ダン" == "ダン"
,==
で比較してもfalse
となります。
「Unicode潔癖症」?
2.
"JavaScript"[4] // "S"
という具合に文字列を文字の配列とみなして文字を取り出すことができますが,
"Swift"[4]
は"t" ではなく
let str = "Swift"
let idx = str.startIndex
str[idx.advancedBy(4)]
これを利用すれば,extension
を使ってInt
による添字を後付けすることは一応できます。
extension String {
subscript(idx:Int)->Character {
return self[self.startIndex.advancedBy(idx)]
}
}
"Swift"[4] // "t"
しかし,.characters
というメソッドを経由しています。Swiftに限らずありとあらゆるソフトウェアは理念と現実の狭間にありますが,
String... the final frontier?
前回''
がSwiftではまだ使われていないことを指摘しました。このことはSwiftの現在の文字列の振る舞いに対し,
しかしオープンソース化され,
裏を返せば,
本誌最新号をチェック!
Software Design 2022年6月号
2022年5月18日発売
B5判/
定価1,342円
- 第1特集
シェルの基本大全
どんな環境でも迷わない・困らない知識 - 第2特集
後悔しないAWSデータベースの選び方
RDSとDynamoDB,使い分けのポイントを徹底解説 - 第3特集
不思議の国のSE用語
一人前のエンジニアになる方法 - 短期連載
新生「Ansible」 徹底解説
[1] Ansibleとは - 短期連載
HashiCorp Vaultではじめるシークレット管理
[最終回] KubernetesからVaultを利用しよう