表題の通り、Swift 3 の String から substring 等を使ってインデックスを指定して部分文字列を取り出す方法です。
またしても書き方が変わったので、とりあえず覚え書き。
言いたいことは色々ありますが、さくっと本題に進みましょう。
Swift 4 での部分文字列の取り出しについては、以下の記事をご覧ください。
スポンサーリンク
読み込み中です。少々お待ち下さい
Swift 3 の substring
とりあえず、こんな風に書けば動く筈。
let text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
print(text.substring(to: text.index(text.startIndex, offsetBy: 6)))
// -> "ABCDEF" 先頭から指定インデックスまで
print(text.substring(from: text.index(text.endIndex, offsetBy: -6)))
// -> "UVWXYZ" 指定インデックスから終端まで
print(text.substring(with: text.index(text.startIndex, offsetBy: 10)..<text.index(text.endIndex, offsetBy: -10)))
// -> "KLMNOP" 範囲指定。以下のようにも書ける
print(text[text.index(text.startIndex, offsetBy: 10)..<text.index(text.endIndex, offsetBy: -10)])
// -> "KLMNOP"
// start - end ではなく長さで指定したい場合のサンプル
let startIndex = text.index(text.startIndex, offsetBy: 2) // 開始位置 2
let endIndex = text.index(startIndex, offsetBy: 6) // 長さ 6
print(text.substring(with: startIndex..<endIndex))
// -> "CDEFGH"
print(text[startIndex..<endIndex])
// -> "CDEFGH"
// text.characters.index のように書く例もあります
print(text.substring(to: text.characters.index(text.startIndex, offsetBy: 6)))
他にもっとシンプルな書き方があったらごめんなさい。
ていうか、この書き方も、果たしていつまでもつことやら......
Swift 2 の substring
以前は、こんな風に書いてました。
let text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
print(text.substringToIndex(text.startIndex.advancedBy(6)))
// -> "ABCDEF" 先頭から指定インデックスまで
print(text.substringFromIndex(text.endIndex.advancedBy(-6)))
// -> "UVWXYZ" 指定インデックスから終端まで
print(text.substringWIthRange(text.startIndex.advancedBy(10)..<text.endIndex.advancedBy(-10)))
// -> "KLMNOP"
全然違うやんけ。
ちなみに、Swift 3 に自動コンバートすると、substringFromIndex, substringToIndex は大体いけますが、substringWithRange は失敗することがあるようです(書き方によるかも)。
おわりに
うーん......いや、Swift 3 ですけれども、それはもちろんですね、とても頭の良い人達が、色々なことを考え合わせながら決めていったんだろうなー、とは思うんですよ。
思うんですが、たとえ別の場面ではとても有用だとしても、これはちょっと......元から面倒だったのに、さらに面倒になってません? これ、どうせ次でまた書き方変わ
ていうか、なんでここでロクに触れられていないのか。
いや、まぁ、もう別にいいですけど(笑)