Swiftでは文字列の操作でIndex型が出てきますが、場合によってはこのIndex型ではなく、Int型が欲しい場合があります。
そこで、以下の2つのサンプルを提示したいと思います。
1文字だけを渡したい場合は、String型のメソッドを利用しています。
文字列を渡したい場合は、プログラムで計算しています。
1文字だけを渡したい場合
extension String { func indexOf(_ substring: Character) -> Int { if let index = self.firstIndex(of: substring) { return self.distance(from: self.startIndex, to: index) } else { return -1 } } func lastIndexOf(_ substring: Character) -> Int { if let index = self.lastIndex(of: substring) { return self.distance(from: self.startIndex, to: index) } else { return -1 } } }
文字列を渡したい場合
extension String { func getString(startIndex: Int, count: Int) -> String { //値を変える場合があるので、ローカル変数に置き換える var count = count let sIndex: Index = self.index(self.startIndex, offsetBy: startIndex) let length: Int = self.distance(from: sIndex, to: self.endIndex) //文字数よりcountが大きい場合は文字数に置き換える if count > length { count = length } let eIndex: Index = self.index(sIndex, offsetBy: count) return String(self[sIndex..Int? { //引数の文字数を取得します let length: Int = self.distance(from: self.startIndex, to: self.endIndex) //後ろから一致するところがないか確認していきます for i in 0..length { if self.getString(startIndex: length - i - value.count, count: value.count) == value { return length - i - value.count } } //一致するものがなかった場合 return nil } func indexOf(value: String) -> Int? { //引数の文字数を取得します let length: Int = self.distance(from: self.startIndex, to: self.endIndex) //前から一致するところがないか確認していきます for i in 0..length { if self.getString(startIndex: i, count: value.count) == value { return i } } //一致するものがなかった場合 return nil } }