[Swift5] FoundationのapplyingTransformでカタカナをひらがなに変換すると長音符号(ー)が勝手に変換される

6884 ワード

タイトルの通りです。長音符号がカタカナに混じっていた場合、わざわざ前の音を考慮してひらがなに変えてくれます。お節介ですね。

import Foundation
let text = "あー"
let katakanaText = text.applyingTransform(.hiraganaToKatakana, reverse: false)!   // カタカナに変換
print(katakanaText)   // "アー"
let hirganaText = katakanaText.applyingTransform(.hiraganaToKatakana, reverse: true)!    // ひらがなに変換
print(hirganaText)    // "ああ"

ではどうするのがいいかといえば、自前で関数を定義するのが良さそうです。ググると実装がいくつかヒットするのですが、Swift5に対応していないものも多かったので今回は自前で作成しました。

extension StringProtocol {
    @inlinable func toKatakana() -> String {
        let result = self.unicodeScalars.map { scalar -> UnicodeScalar in
            if 0x3041 <= scalar.value && scalar.value <= 0x3096 {
                return UnicodeScalar(scalar.value+96)!
            } else {
                return scalar
            }
        }
        return String(String.UnicodeScalarView(result))
    }

    @inlinable func toHiragana() -> String {
        let result = self.unicodeScalars.map { scalar -> UnicodeScalar in
            if 0x30A1 <= scalar.value && scalar.value <= 0x30F6 {
                return UnicodeScalar(scalar.value-96)!
            } else {
                return scalar
            }
        }
        return String(String.UnicodeScalarView(result))
    }
}

要らないところで気を利かせて来ないでくれ……という気持ちです。