Swift 4で文字列の最後から検索する

だんだん何をしたいのかわからなく・・・

文字列の何文字目を抽出、とかを text[0] で参照しようとすると

Cannot subscript a value of type 'String.SubSequence' (aka 'Substring') with an index of type 'Int'

で怒られる。

趣旨は String.index(of: Character) の逆バージョンです。

extension String {
    public func index(endof element: Character) -> String.Index? {
        for i in (0..<self.count).reversed() {
            if self[String.Index.init(encodedOffset: i)] == element {
                return String.Index.init(encodedOffset: i)
            }
        }
        return nil
    }
}

呼び出し側

let text = "foo ( bar ( baz ) qux ) quux"
if let startIndex = text.index(of: "("), let endIndex = text.index(endof: ")") {
    print("indexEndOf: [\(String(text[startIndex...endIndex]))]")
}

出力結果

indexEndOf: [( bar ( baz ) qux )]

Swift 4 から String.substring に規制がかかって色々やりづらい・・・;

公式の以下の文も気になる。

Substring (公式)

Important

Don’t store substrings longer than you need them to perform a specific operation. A substring holds a reference to the entire storage of the string it comes from, not just to the portion it presents, even when there is no other reference to the original string. Storing substrings may, therefore, prolong the lifetime of string data that is no longer otherwise accessible, which can appear to be memory leakage.

フォローする