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の「後の」インデックス(場所)を指したいときにつかうやつ。指定した文字の範囲を越えると実行時にエラーが出ます。