[iOS|Swift3] ひらがな、カタカナ変換を文字列表で行いたい

2017/05/18

こんにちは。きんくまです。

iOSはswiftのバージョンがあがるたびに、今まで動いていたコードが動かなくなることが多いです。
swift3で一番困ったのが、!のオプショナルの文字列化。

以前は

let str:String! = "hello"
print("\(str)") //-> hello 

こんな感じに、!のオプショナルは普通のStringと同じように文字列化していました

でもswift3だと

let str:String! = "hello"
print("\(str)") //-> Optional("hello")

とかいう感じに、Optional( xx ) という文字列が加えられちゃってました。
おいー!挙動違いすぎるぞー(泣)!
フォルメモのアップデート中、結構これにやられてました、、。エラーが出ないで動いちゃっているところがこわい。

これからは@IBOutletのところ以外は ! のオプショナルは使わないようにします、、。

それで本題です。

ひらがな、カタカナ変換を文字列表で行いたい

ひらがな <- -> カタカナ の変換は swift2 でこちらで紹介されていたものを使っていました。
Stringクラスにひらがな・カタカナ変換をextensionする

ただ、これも上であげたOptionalの挙動のせいでうまく動かなくなってしまいました。
なので、今後swiftのバージョンが上がってもそんなに修正しなくてすむような愚直なバージョンを作ることにしました。

HiraganaKtakanaUtil.swift

class HiraganaKtakanaUtil{
    static let HIRAGANA_TEXT:String = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉゃゅょっ"
    static let KATAKANA_TEXT:String = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポァィゥェォャュョッ"
    static let HIRAGANA_TABLE:[Character] = Array(HIRAGANA_TEXT.characters)
    static let KATAKANA_TABLE:[Character] = Array(KATAKANA_TEXT.characters)
    
    class func toKatakana(_ text:String) -> String {
        var replacedTexts:[Character] = []
        
        let splitedTexts:[Character] = Array(text.characters)
        for char in splitedTexts {
            if let index = HIRAGANA_TABLE.index(of: char) {
                replacedTexts.append(KATAKANA_TABLE[index])
            } else {
                replacedTexts.append(char)
            }
        }
        
        return String(replacedTexts)
    }
    
    class func toHiragana(_ text:String) -> String {
        var replacedTexts:[Character] = []
        
        let splitedTexts:[Character] = Array(text.characters)
        for char in splitedTexts {
            if let index = KATAKANA_TABLE.index(of: char) {
                replacedTexts.append(HIRAGANA_TABLE[index])
            } else {
                replacedTexts.append(char)
            }
        }
        
        return String(replacedTexts)
    }
}

1. ひらがな、カタカナのテーブルを作っておく
2. 対象文字列を1文字ずつ分解
3. 変換したい文字列がみつかったら、対になるテーブルの同じインデックスに変換

軽くテストしてみました

func test_toKatakana() {
    var result:String = ""
    result = HiraganaKtakanaUtil.toKatakana("")
    XCTAssertEqual(result, "")
    result = HiraganaKtakanaUtil.toKatakana("あいうえお")
    XCTAssertEqual(result, "アイウエオ")
    result = HiraganaKtakanaUtil.toKatakana("たちサつシてス")
    XCTAssertEqual(result, "タチサツシテス")
    result = HiraganaKtakanaUtil.toKatakana("aあい😀ぇっ")
    XCTAssertEqual(result, "aアイ😀ェッ")
}

func test_toHiragana() {
    var result:String = ""
    result = HiraganaKtakanaUtil.toHiragana("")
    XCTAssertEqual(result, "")
    result = HiraganaKtakanaUtil.toHiragana("アイウエオ")
    XCTAssertEqual(result, "あいうえお")
    result = HiraganaKtakanaUtil.toHiragana("たちチサ漢字ス")
    XCTAssertEqual(result, "たちちさ漢字す")
    result = HiraganaKtakanaUtil.toHiragana("aアイ😀ェッ")
    XCTAssertEqual(result, "aあい😀ぇっ")
}

もともとのものと速さは比較していないのですが、すんごく遅かったらスミマセン。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る