朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
Swift 文字が一致する位置を整数で欲しい場合





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

    
}








良いやや良い普通やや悪い悪い

投稿日時評価コメント