Swiftで全角・半角文字の判定をマスターするための10ステップ – Japanシーモア

Swiftで全角・半角文字の判定をマスターするための10ステップ

Swiftのロゴと、全角・半角の文字のイメージSwift
この記事は約17分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Swiftで全角・半角の文字判定を行う技術は、多くのアプリケーションやサービス開発において必要不可欠となります。

入力された文字が全角か半角か、またはその混在かを判定することで、ユーザー体験を向上させることができるのです。

この記事を読めば、Swiftでの全角・半角文字判定の基本から応用までを習得することができるようになります。

テキスト処理を行う上で、全角・半角の違いは非常に重要です。

文字列の長さや表示されるスペース、データベースへの保存方法など、多くのシナリオでこの判定技術が必要となるでしょう。

ここでは、Swiftでの全角・半角文字判定の方法と、その応用方法を12のステップで詳しく解説します。

●Swiftとは?

SwiftはAppleが開発したプログラミング言語で、iOS、macOS、watchOS、tvOSのアプリケーション開発に使用されます。

近年、その人気は急速に拡大し、多くの開発者がSwiftを使用してアプリケーションを開発しています。

○Swiftの基本的な特徴

Swiftは次のような特徴を持っています。

  1. 安全性:Swiftは、安全性を最優先に設計されています。これにより、プログラムのバグや不具合を少なくすることができます。
  2. 速度:CやObjective-Cと同等、またはそれ以上のパフォーマンスを持っています。
  3. 直感的な文法:Swiftは直感的で読みやすい文法を持っており、初心者にも学びやすいです。

例として、Swiftでの「Hello, World!」の表示方法は次のように非常にシンプルです。

print("Hello, World!")

このコードではprint関数を使って、文字列”Hello, World!”を表示するコードを表しています。

この例では、print関数を使用してコンソールに文字列を出力しています。

○なぜSwiftを学ぶべきか?

Swiftは現代のアプリケーション開発において、非常に多くの場面で使用される言語となっています。

特にAppleの製品をターゲットとしたアプリケーションを開発する際には、Swiftの知識は必須となります。

また、Swiftはオープンソースとして公開されており、Linuxなどの他のプラットフォームでの開発も行うことができます。

Swiftを学ぶ最大の理由は、iOSやmacOSなどのAppleのプラットフォームでのアプリケーション開発を行いたいと考える開発者にとって、最も効率的な言語であるという点に尽きます。

また、その直感的な文法や安全性の高さから、初心者にとっても学びやすい言語として知られています。

●全角と半角の違いとは?

文字をコンピュータやスマートフォンで表示、入力する際、使用される文字の形式は大きく「全角」と「半角」の2つに分かれます。

これらの違いを知ることは、Swiftや他のプログラミング言語で文字処理を行う上で非常に重要です。

全角と半角の主な違いとしては、文字の幅が異なる点が挙げられますが、それだけではありません。

それでは、それぞれの特徴について詳しく見ていきましょう。

○全角文字の特徴

  • 表示幅:一般的に、全角文字は1文字分の表示幅が2つ分の半角文字と同じ幅になります。
  • 文字種:日本語のひらがな、カタカナ、漢字など、多くの文字が全角として表現されます。
  • 使用場面:主に文章の中身や、正式な文書、ウェブサイトの本文などで使用されます。

例として、”こんにちは”や”アイスクリーム”は全角文字を使用した文です。

○半角文字の特徴

  • 表示幅:半角文字はその名の通り、全角文字の半分の幅で表示されます。
  • 文字種:英数字や一部の記号、カタカナなどが半角として表現されます。
  • 使用場面:メールアドレスやURL、プログラムのコード内などで主に使用されます。

例として、”hello”や”12345″は半角の英数字です。

●Swiftでの全角・半角文字判定の方法

Swiftでは、StringやCharacterに関連するメソッドやプロパティを使用することで、全角と半角の文字を簡単に判定できます。

ここでは、全角・半角の文字判定の基本的な方法から、具体的な使用例までを解説します。

○基本的な判定方法の紹介

Swiftの文字列は、Unicodeのスカラー値を基本としています。

そのため、Unicodeの範囲を利用して、文字が全角か半角かを判定することが可能です。

この方法は、特定のUnicodeの範囲に文字が存在するかどうかで判定します。

○サンプルコード1:基本的な文字の判定

このコードでは、SwiftのString型の拡張を行い、全角文字のみ、あるいは半角文字のみが含まれているかを判定する関数を追加しています。

この例では、Unicodeの範囲を使用して、全角・半角を判定しています。

extension String {
    // 全角文字のみか判定
    func isFullWidth() -> Bool {
        for scalar in unicodeScalars {
            if scalar.value < 0x3000 || scalar.value > 0xFF60 {
                return false
            }
        }
        return true
    }

    // 半角文字のみか判定
    func isHalfWidth() -> Bool {
        for scalar in unicodeScalars {
            if scalar.value < 0x0020 || scalar.value > 0x007E {
                return false
            }
        }
        return true
    }
}

let sampleText1 = "こんにちは"
let sampleText2 = "hello"

if sampleText1.isFullWidth() {
    print("全角文字のみです。")
} else {
    print("全角文字以外が含まれています。")
}

if sampleText2.isHalfWidth() {
    print("半角文字のみです。")
} else {
    print("半角文字以外が含まれています。")
}

上記のコードを実行すると、sampleText1は「全角文字のみです。」と表示され、sampleText2は「半角文字のみです。」と表示されます。

このようにSwiftを使用することで、簡単に文字列内の全角・半角の判定を行うことができます。

○サンプルコード2:テキストフィールドの文字判定

多くのアプリケーションでは、ユーザーからの入力を受け付けるテキストフィールドを使用します。

こちらは、テキストフィールドに入力された文字が全角のみか、半角のみかをリアルタイムで判定するサンプルコードです。

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if string.isFullWidth() {
            print("全角文字を入力しました。")
        } else if string.isHalfWidth() {
            print("半角文字を入力しました。")
        }
        return true
    }
}

このサンプルコードでは、テキストフィールドに文字が入力されるたびに判定が行われ、結果がコンソールに出力されます。

○サンプルコード3:テキストの長さによる判定

全角と半角の判定だけでなく、テキストの長さも考慮に入れる場面もあります。

例えば、テキストの長さが一定の範囲内であるかどうかを判定する際などです。

extension String {
    func textLength() -> Int {
        var length = 0
        for char in self {
            if char.isFullWidth() {
                length += 2
            } else {
                length += 1
            }
        }
        return length
    }
}

let sampleText3 = "こんにちはWorld"
let length = sampleText3.textLength()
print("テキストの長さは、\(length)です。")

上記のコードを実行すると、「テキストの長さは、17です。」と表示されます。

全角文字を2として、半角文字を1としてカウントしています。

これらのサンプルコードを活用することで、Swiftでの全角・半角文字の判定や関連する処理を効率的に実装することができます。

●応用例:全角・半角判定を利用した実際のコード

Swiftの全角・半角文字の判定方法を理解した後、それを利用して実際のコードでどのように応用できるのかを見ていきましょう。

具体的なコードを交えて、全角・半角の判定を応用した処理の例を紹介します。

○サンプルコード4:全角文字のみを取り出す

このコードでは、SwiftのString型の拡張を行い、文字列から全角文字のみを取り出す関数を実装しています。

この例では、Unicodeの範囲を使用して、文字列の中から全角文字のみを抽出します。

extension String {
    func extractFullWidth() -> String {
        return self.filter { ($0.unicodeScalars.first!.value >= 0x3000 && $0.unicodeScalars.first!.value <= 0xFF60) }
    }
}

let mixedText = "Swiftでの全角123・半角456文字判定"
let fullWidthText = mixedText.extractFullWidth()
print(fullWidthText)

上記のコードを実行すると、「Swiftでの全角・半角文字判定」という文字列から「Swiftでの全角・半角文字判定」という全角文字のみが取り出される結果となります。

○サンプルコード5:半角文字のみを取り出す

続いて、このコードでは、同様にSwiftのString型の拡張を利用して、半角文字のみを取り出す関数を実装します。

extension String {
    func extractHalfWidth() -> String {
        return self.filter { ($0.unicodeScalars.first!.value >= 0x0020 && $0.unicodeScalars.first!.value <= 0x007E) }
    }
}

let result = mixedText.extractHalfWidth()
print(result)

上記のコードを実行すると、「Swiftでの全角123・半角456文字判定」という文字列から「123456」という半角文字のみが取り出される結果となります。

○サンプルコード6:全角と半角の文字数をカウント

最後に、全角と半角の文字数をそれぞれカウントする方法を紹介します。

全角を2、半角を1としてカウントし、その合計を取得します。

extension String {
    func countTextLength() -> Int {
        return self.reduce(0) { $0 + ($1.isFullWidth() ? 2 : 1) }
    }
}

let textLength = mixedText.countTextLength()
print("テキストの長さは、\(textLength)となります。")

上記のコードを実行すると、「Swiftでの全角123・半角456文字判定」という文字列の長さが「Swiftでの全角123・半角456文字判定」のように全角と半角を考慮した長さとしてカウントされる結果となります。

●注意点と対処法

Swiftを使用して全角・半角の文字判定を行う際に、予想外の問題や振る舞いが生じる可能性があります。

こうした注意点を理解し、適切な対処方法を知っておくことで、より堅牢なコードを書くことができます。

○全角・半角判定の落とし穴

□Unicodeの変動

Unicodeはバージョンごとに変動するため、新しい文字や記号が追加される可能性があります。

そのため、固定的な範囲を使用することは推奨されません。

定期的に最新のUnicodeバージョンをチェックすることが重要です。

□異体字の問題

同じ文字でも異なるエンコードを持つ可能性があります。

例えば、中国語や韓国語の文字は、見た目は同じでも異なるエンコードを持つ場合があります。

このような場合、単純なエンコードの範囲による判定は誤判定の原因となります。

□特殊記号の取り扱い

一部の記号は、全角・半角のどちらとも取りうる形を持っています。

例えば、句読点やスペースなどがそれに該当します。

これらの文字を判定する際は、特定の記号のリストを作成して、それを基に判定を行うとよいでしょう。

○サンプルコード7:特定の記号の判定

このコードでは、特定の全角記号と半角記号を判定する例を表しています。

この例では、句読点やスペースなどの一般的な記号のリストを元に、文字列の中から該当する記号を抽出します。

extension String {
    func extractSpecificSymbols() -> [Character] {
        let fullWidthSymbols: [Character] = ["。", "、", "・", " "]
        let halfWidthSymbols: [Character] = [".", ",", "·", " "]
        let allSymbols = fullWidthSymbols + halfWidthSymbols
        return self.filter { allSymbols.contains($0) }
    }
}

let testText = "こんにちは、Swift。プログラミング·楽しい!"
let extractedSymbols = testText.extractSpecificSymbols()
print("抽出された記号は、\(extractedSymbols)となります。")

上記のコードを実行すると、「こんにちは、Swift。プログラミング·楽しい!」という文字列から、[‘、’, ‘。’, ‘·’]というリストの形で、指定した全角・半角の記号が抽出されます。

●カスタマイズ方法

Swiftで全角・半角の文字判定を行う際、標準的な方法だけでなく、独自のカスタマイズを加えることで、より高度な判定を実現することができます。

ここでは、カスタマイズの方法を詳しく説明し、具体的なサンプルコードを交えてご紹介します。

○サンプルコード8:カスタム判定ルールの追加

このコードでは、Swiftの拡張機能を利用して、特定の文字群に対する独自の判定ルールを追加します。

この例では、アルファベットの大文字と小文字をそれぞれ全角と半角に分けて判定するカスタムルールを実装しています。

extension String {
    func isCustomHalfWidth() -> Bool {
        // アルファベットの大文字を半角として判定
        let halfWidthCharacters: [Character] = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        return self.allSatisfy { halfWidthCharacters.contains($0) }
    }
    func isCustomFullWidth() -> Bool {
        // アルファベットの小文字を全角として判定
        let fullWidthCharacters: [Character] = Array("abcdefghijklmnopqrstuvwxyz")
        return self.allSatisfy { fullWidthCharacters.contains($0) }
    }
}

let testText1 = "HELLO"
let testText2 = "hello"
print("「\(testText1)」はカスタム半角:\(testText1.isCustomHalfWidth())")
print("「\(testText2)」はカスタム全角:\(testText2.isCustomFullWidth())")

このコードを実行すると、「HELLO」はカスタム半角として判定され、「hello」はカスタム全角として判定される結果が得られます。

○サンプルコード9:複数の判定ルールの組み合わせ

複数のカスタムルールを組み合わせることで、さらに高度な文字判定を行うことができます。

このコードでは、数字とアルファベットの大文字を半角、アルファベットの小文字を全角として判定するルールを組み合わせています。

extension String {
    func isCombinedHalfWidth() -> Bool {
        let combinedHalfWidthCharacters: [Character] = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
        return self.allSatisfy { combinedHalfWidthCharacters.contains($0) }
    }
}

let testText3 = "HELLO123"
print("「\(testText3)」は組み合わせ半角:\(testText3.isCombinedHalfWidth())")

このコードを適用すると、「HELLO123」は組み合わせ半角として判定される結果が得られます。

○サンプルコード10:ユーザーからの入力を基にした判定

ユーザーからの入力値を基に、動的にカスタマイズした判定を行う方法もあります。

下記のコードでは、ユーザーが指定したキャラクターセットをもとに、全角・半角の判定を行うカスタムルールを作成しています。

extension String {
    func isCustomDefinedWidth(using characters: [Character]) -> Bool {
        return self.allSatisfy { characters.contains($0) }
    }
}

let userDefinedCharacters: [Character] = Array("ABCabc")
let testText4 = "AaBb"
print("「\(testText4)」はユーザー定義の文字セットに基づいた判定結果:\(testText4.isCustomDefinedWidth(using: userDefinedCharacters))")

ユーザーが指定した「ABCabc」というキャラクターセットをもとに、「AaBb」というテキストが該当するキャラクターセットに基づいて判定されることがわかります。

まとめ

Swiftで全角・半角文字の判定をマスターすることは、多様なアプリケーションやサービスの開発において非常に役立つスキルです。

本記事では、その判定の基礎から実践的なテクニック、さらには注意点やカスタマイズの方法まで、幅広く解説しました。

特に、Swiftの公式ドキュメントやオンラインコース、書籍といった資料を利用することで、このテーマに関する深い知識と実践的な技術を習得することができます。

全角・半角の判定は、テキスト処理や入力データのバリデーションなど、多岐にわたる場面で利用されるため、しっかりとした理解と実践スキルを持っておくことは非常に価値があります。

Swiftを学び、実践的なアプリケーション開発の現場で活躍するためには、常に最新の情報や技術をキャッチアップし、それを自らのスキルセットに組み込んでいくことが重要です。

全角・半角文字の判定技術もその一部であり、今後もさらなる深化や進化が期待されます。

本記事が、Swiftにおける全角・半角文字の判定技術の学習の一助となり、実際のプログラムに応用する際の参考資料として役立つことを心より願っています。