2018年1月14日日曜日

任意の位置の文字を取り出す

やりたいこと

たとえば"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 s = String(subS) //④

昔のBASICだとRight$、Left$、Mid$とかの関数でちょいちょいできたんだけど、Swiftだとちょっと面倒。
文字を取り出す開始位置、終了位置を決め、それをSwiftのRange(範囲指定)の書き方で指定してやる必要がある。

例として4文字目から2文字「de」を取り出してみる。

①が開始位置、②が終了位置を設定するもの。

①が開始位置の指定。
offsetBy:は何文字目かということ。0オリジンのインデックスなので、4文字目なら3。

②が終了位置の指定。
直前で得た開始位置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]
という書き方もできる。

注意点

④ただ使うだけならこれだけでいいんだけど、取り出した文字列はSubStringというものになってて元の文字列を参照しているだけなので、元の文字列(ここではstr)が消えると消えてしまうのだそうだ。
だから独立した文字列にするためString( )で囲んでやってる。

Swift4より前では別の書き方をしていたそうだが、それは知らんのでここでは触れない。

もっと簡単にしてよ

開始/終了位置のindexを作り…ってのはわかるけど、SubStringがどーのってのも含め、もっと簡単にして欲しいよね。
それこそBASICのmid$に相当する関数を自作しておいた方がいい。

なお、先頭から/末尾から3文字取り出すっていうのは
let pre = str.prefix(3)
let suf = str.suffix(3)
のように超簡単。SubStringになってるのかどうかは知らんが。

0 件のコメント:

コメントを投稿