1. ホーム
  2. ios

[解決済み] Swift 文字の先頭から最後のインデックスまでの部分文字列を取得する方法

2022-09-19 20:01:21

質問

文字列を別の文字列に変換する最も良い/簡単な方法を知りたいのですが、サブセットのみで、最初から始まって文字の最後のインデックスに行くのです。

たとえば、"www.stackoverflow.com" を "www.stackoverflow" に変換します。 どのようなコード スニペットがそれを行うことができ、最も迅速であるのでしょうか。(私は、これが議論を引き起こさないことを望みますが、Swiftで部分文字列を処理する方法についての良いレッスンを見つけることができません。

どのように解決するのか?

逆アクセスするだけ

最良の方法は substringToIndex に組み合わせることです。 endIndex プロパティと advance グローバル関数

var string1 = "www.stackoverflow.com"

var index1 = advance(string1.endIndex, -4)

var substring1 = string1.substringToIndex(index1)

背面から文字列を探す

使用方法 rangeOfString と設定し options.BackwardsSearch

var string2 = "www.stackoverflow.com"

var index2 = string2.rangeOfString(".", options: .BackwardsSearch)?.startIndex

var substring2 = string2.substringToIndex(index2!)

拡張機能はなく、純粋に慣用的なSwift

Swift 2.0

advance は、現在 Index と呼ばれ advancedBy . みたいな感じでやるんですね。

var string1 = "www.stackoverflow.com"

var index1 = string1.endIndex.advancedBy(-4)

var substring1 = string1.substringToIndex(index1)

Swift 3.0

を呼び出すことはできません。 advancedBy の上で String は可変サイズの要素を持つため を使う必要があります。 index(_, offsetBy:) .

var string1 = "www.stackoverflow.com"

var index1 = string1.index(string1.endIndex, offsetBy: -4)

var substring1 = string1.substring(to: index1)

いろいろなものの名前が変わりました。ケースはcamelCaseで書かれています。 startIndex となり lowerBound .

var string2 = "www.stackoverflow.com"

var index2 = string2.range(of: ".", options: .backwards)?.lowerBound

var substring2 = string2.substring(to: index2!)

また、強制的にアンラップすることはお勧めしません。 index2 . オプショナルバインディングを使うか map . 個人的には map :

var substring3 = index2.map(string2.substring(to:))

スウィフト4

Swift 3 のバージョンも有効ですが、インデックスの範囲を指定して添え字を使えるようになりました。

let string1 = "www.stackoverflow.com"

let index1 = string1.index(string1.endIndex, offsetBy: -4)

let substring1 = string1[..<index1]

2番目のアプローチは変更されません。

let string2 = "www.stackoverflow.com"

let index2 = string2.range(of: ".", options: .backwards)?.lowerBound

let substring3 = index2.map(string2.substring(to:))