やりたいこと
たとえば"abcdefghijklmn"という文字列の中から、任意の位置の文字(文字列)を取り出したい。
やり方
let str = "abcdefghijklmn"
let start = str.index(str.startIndex, offsetBy: 3) //①
let end = str.index(start, offsetBy: 2) //②
let subS = str[start..<end] //③
let subS = str[start..<end] //③
let s = String(subS) //④
昔のBASICだとRight$、Left$、Mid$とかの関数でちょいちょいできたんだけど、Swiftだとちょっと面倒。
文字を取り出す開始位置、終了位置を決め、それをSwiftのRange(範囲指定)の書き方で指定してやる必要がある。
例として4文字目から2文字「de」を取り出してみる。
例として4文字目から2文字「de」を取り出してみる。
①が開始位置の指定。
offsetBy:は何文字目かということ。0オリジンのインデックスなので、4文字目なら3。
offsetBy:は何文字目かということ。0オリジンのインデックスなので、4文字目なら3。
②が終了位置の指定。
直前で得た開始位置startを使い、そこから何文字目かという書き方をしている。取り出すのが2文字なのでoffsetBy:に2。
逆に終了位置を元の文字列strの先頭から数えて指定する場合は以下でもいい。
let end = str.index(str.startIndex, offsetBy: 5)
直前で得た開始位置startを使い、そこから何文字目かという書き方をしている。取り出すのが2文字なのでoffsetBy:に2。
逆に終了位置を元の文字列strの先頭から数えて指定する場合は以下でもいい。
let end = str.index(str.startIndex, offsetBy: 5)
これによってともに「f」の文字の位置がendに入る。
それを
③str[start..<end]
と範囲指定をして実際に取り出す。
新しいfor構文の for i in 0...10 と同じようなやり方だ。[ ] で囲むのがなんか配列っぽい。
終了位置を1つ前にする必要あるけど、当然
str[start...end]
という書き方もできる。
終了位置を1つ前にする必要あるけど、当然
str[start...end]
という書き方もできる。
注意点
④ただ使うだけならこれだけでいいんだけど、取り出した文字列はSubStringというものになってて元の文字列を参照しているだけなので、元の文字列(ここではstr)が消えると消えてしまうのだそうだ。
だから独立した文字列にするためString( )で囲んでやってる。
Swift4より前では別の書き方をしていたそうだが、それは知らんのでここでは触れない。
開始/終了位置のindexを作り…ってのはわかるけど、SubStringがどーのってのも含め、もっと簡単にして欲しいよね。もっと簡単にしてよ
それこそBASICのmid$に相当する関数を自作しておいた方がいい。
なお、先頭から/末尾から3文字取り出すっていうのは
let pre = str.prefix(3)
let suf = str.suffix(3)
0 件のコメント:
コメントを投稿