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
}
}
