web-dev-qa-db-ja.com

swift 3サブストリングの開始インデックス(int)を取得

文字列内の部分文字列の開始位置と終了位置を取得したいと思います。例:文字列「こんにちは、これは私の名前です」。 「this」という文字列を指定すると、開始インデックスが4で終了インデックスが7になります。

私はこれを含むいくつかのリンクを見つけました:

Swift:文字列内の部分文字列の開始インデックスを取得 a-substring-in-a-string

しかし、このメソッドはrangeと呼ばれるようになったため、Swift 3では機能しません。

私は今これを使用しています:

let range = mystring.range(of: "StringSearch")?.lowerBound

これはこれを返します

Swift.String.UnicodeScalarView.Index(_position: 15), _countUTF16: 1))

これはインデックスであるため、整数として位置を取得できません。

要約すると、int型の変数に位置、この場合は15が必要です。

誰も私を助けることができますか?

みんな、ありがとう。

17
rog

distance(from:to:)Stringのメソッドは、2つのString.Index値:

let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
    let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
    let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
    print(startPos, endPos) // 3 7
}

実際には、呼び出しを文字列のCharacterViewに転送するだけなので、上記の結果は次のようになります。

let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
    let startPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.lowerBound)
    let endPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.upperBound)
    print(startPos, endPos) // 3 7
}

文字列のallオカレンスが必要な場合:

let mystring = "this is this and that is that"
var searchPosition = mystring.startIndex
while let range = mystring.range(of: "this", range: searchPosition..<mystring.endIndex) {
    let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
    let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
    print(startPos, endPos)

    searchPosition = range.upperBound
}
24
Martin R

Martin Rからの関数への適応された答えは、最初の出現をNSRangeとして与えます。これをextensionStringに変えることもできます。

public class func indexOf(string: String, substring: String) -> NSRange? {
    if let range = string.range(of: substring) {
        let startPos = string.distance(from: string.startIndex, to: range.lowerBound)
        return NSMakeRange(startPos, substring.count)
    }
}
1
GabeV