Swift 4 の String で Substring 的な拡張をする

Swift 4からSubstringがdeprecatedになった(=使えなくなった)のでStringの拡張として作りました。書き方として適切かは怪しいのでその辺りはご了承ください。

遭遇しそうなエラーの面々。

Cannot subscript a value of type 'String' with an index of type 'PartialRangeUpTo'
'subscript' is unavailable: cannot subscript String with a CountableRange, see the documentation comment for discussion
'..<' is unavailable: Any String view index conversion can fail in Swift 4; please unwrap the optional indices

ブラケットなど(特定の文字)で囲われた文字を抽出するだけの拡張です。

何番目の文字から何番目の文字と、数値で指定する場合は以下のサイトが良いかと思います。
Swift 4 で substring 的にインデックスを指定して部分文字列を取り出す方法

以下、区切り文字(delimiter)として指定したCharacterを含む場合と除外するふたパターン。

extension String {
    func substring(from: Character, to: Character) -> String? {
        return substring(from: from, to: to, ignoreDelimiter: false)
    }
    func substring(from: Character, to: Character, ignoreDelimiter: Bool) -> String? {
        if let startIndex = self.index(of: from), let endIndex = self.index(of: to) {
            return self[self.index(startIndex, offsetBy: (ignoreDelimiter == true ? 1 : 0) )...self.index(endIndex, offsetBy: (ignoreDelimiter == true ? -1 : 0) )].description
        }
        return nil
    }
}

Swift 4ではString型を使って取得したい文字を [ ] で指定するときにIntではなく、String.IndexでRangeを指定する必要があるが故です。

利用サンプル

let text: String = "<!DOCTYPE html><html>"
print(text.substring(from: "<", to: ">")!)
print(text.substring(from: "<", to: ">", ignoreDelimiter: true)!)

実行結果

<!DOCTYPE html>
!DOCTYPE html

String.indexをXCode上で指定した時に補完として表示される一覧が以下。


主な呼び出し方の補足的な何か。

String.Index index(i: String.Index, offsetBy: Int)
特定の文字を数値で指定する時などに使えるやつ。String.startIndexとString.endIndexがあるのでその辺りをiに指定して、offsetByはそこを起点にして何文字か、という感じ。文字そのものの場所を指定する場合は 0 を指定。

String.Index index(before: String.Index)
beforeに指定したString.indexの「前の」インデックス(場所)を指したいときにつかうやつ。指定した文字の範囲を越えると実行時にエラーが出ます。たとえば文字列の先頭でこれを使うと(beforeにtext.startIndexを指定するなどした場合)範囲を超えるのでエラーになります。
逆に最後の文字を取得したい場合は、beforeにtext.endIndexを指定すると最後の文字として指定することができます。

String.Index index(after: String.Index)
afterに指定したString.indexの「後の」インデックス(場所)を指したいときにつかうやつ。指定した文字の範囲を越えると実行時にエラーが出ます。

フォローする