読み込み中...

Swiftでのグローバル変数の活用法10選

Swift言語でグローバル変数を活用するプログラマーのイラスト Swift
この記事は約17分で読めます。

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

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

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

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

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

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

はじめに

SwiftはiOSやMacOSなどのAppleプラットフォーム向けのプログラムを開発するための言語として非常に人気があります。

Swiftを学ぶ際、グローバル変数の扱いはとても重要なトピックとなります。

この記事を読めば、Swiftでのグローバル変数の効果的な活用法や正しい使い方、さらには注意点やカスタマイズ方法まで、徹底的にマスターすることができるようになります。

初心者の方から中級者まで、Swiftでのグローバル変数の利用に自信を持ちたいという方は、ぜひ最後までお付き合いください。

●Swiftとは

Swiftは、Appleが2014年に公開した新しいプログラミング言語です。

Objective-Cの後継言語として開発され、iOSやMacOS、WatchOSなど、Appleのプラットフォーム向けのアプリケーション開発において、現在主流となっています。

○Swiftの特徴

  1. 速さ:Swiftは高速な実行性能を持っています。そのため、リアルタイムのゲームや高負荷な処理でも、快適に動作するアプリを作成することができます。
  2. 安全性:Swiftは、安全性を第一に設計されています。例えば、変数がnilの状態で使われることを防ぐOptional型や、配列の範囲外アクセスを防ぐための機能がデフォルトで組み込まれています。
  3. 簡潔性:Swiftの文法は、読みやすく書きやすいことを目指して設計されています。そのため、より少ないコードで意図を明確に伝えることができるようになっています。
  4. 互換性:SwiftはObjective-Cとの高い互換性を持っており、両言語を1つのプロジェクト内で混在させることが可能です。これにより、古いObjective-CのコードをSwiftへスムーズに移行することができます。
  5. 活発なコミュニティ:Swiftはオープンソースとして公開されており、全世界の開発者たちがその進化に貢献しています。そのため、新しいライブラリやツール、情報が日々アップデートされています。

Swiftのこれらの特徴を理解することで、どのような場面でSwiftを利用するのが最適なのか、また、どのようにして更に効率的なコーディングを行っていくのかが見えてくるでしょう。

●グローバル変数とは

グローバル変数とは、プログラムのどこからでもアクセス可能な変数のことを指します。

関数やクラスの外側で定義され、アプリケーション全体で利用されるデータを保持するための変数として活用されます。

Swiftにおいても、このグローバル変数は非常に重要な存在となっており、適切に管理・活用することでプログラムの効率や可読性を向上させることが可能です。

○グローバル変数の基本

Swiftでのグローバル変数は、関数やクラス、構造体の外で定義されます。

この変数はプログラムが実行される際に初期化され、アプリケーションが終了するまでその値を保持し続けます。

このコードでは、グローバル変数として整数型のglobalNumberを定義し、初期値として10を設定しています。

var globalNumber: Int = 10

func showGlobalNumber() {
    print(globalNumber) // グローバル変数の値を表示
}

showGlobalNumber()

この例では、showGlobalNumber関数内でグローバル変数globalNumberの値を出力しています。

関数を実行すると、コンソールに10と表示されることが期待されます。

グローバル変数はプログラムのどこからでもアクセスすることができるため、共通の設定値やデータを保持するのに役立ちます。

しかし、誤って変更されると予期しないバグの原因となる可能性もあるため、注意深く使用する必要があります。

●Swiftでのグローバル変数の使い方

Swiftにおけるグローバル変数の使い方を正しく理解し、効率的にプログラムを作成するためのノウハウを紹介します。

サンプルコードを交えながら、実践的な使い方から注意点まで詳しく解説します。

○サンプルコード1:基本的なグローバル変数の宣言と利用

Swiftにおけるグローバル変数の基本的な宣言方法とその利用方法を紹介します。

この例では、String型のgreetingという名前のグローバル変数を宣言し、その後、関数内で利用しています。

var greeting: String = "こんにちは、Swift!"

func displayGreeting() {
    print(greeting) // グローバル変数の値を出力
}

displayGreeting()

このサンプルコードを実行すると、「こんにちは、Swift!」という文字列が出力されることを期待します。

グローバル変数greetingは、どの関数からでもアクセス可能なので、非常に便利です。

○サンプルコード2:関数内からグローバル変数を呼び出す

グローバル変数は、関数内外を問わずアクセスできるため、関数内での利用も可能です。

この例では、整数型のcounterというグローバル変数を宣言し、関数内でその値をインクリメントする方法を表します。

var counter: Int = 0

func incrementCounter() {
    counter += 1
    print("現在のカウンターの値: \(counter)")
}

incrementCounter()
incrementCounter()

このサンプルコードを実行すると、カウンターの値が1つずつ増えていき、「現在のカウンターの値: 1」、「現在のカウンターの値: 2」と順番に表示されることを期待します。

○サンプルコード3:グローバル変数を利用した計算処理

グローバル変数は計算処理にも利用できます。

この例では、2つのグローバル変数を利用して算数の計算を行い、その結果を表示する方法を紹介します。

var number1: Int = 10
var number2: Int = 20

func calculateSum() {
    let sum = number1 + number2
    print("二つの数の合計: \(sum)")
}

calculateSum()

このサンプルコードを実行すると、「二つの数の合計: 30」と表示されることを期待します。

このようにグローバル変数を活用することで、計算処理やデータの取り扱いを簡単に行うことができます。

●グローバル変数の応用例

Swift言語でのグローバル変数は、単なる変数の宣言や利用以上の応用的な使い方も可能です。

ここでは、異なるファイル間でのデータ共有やデータの保存といった、実践的な応用例をサンプルコードを交えて解説します。

○サンプルコード4:複数のファイル間でのグローバル変数の共有

プロジェクト内の異なるファイル間で変数を共有したい場合、グローバル変数が役立ちます。

このコードでは、GlobalData.swiftというファイルにグローバル変数を宣言し、別のファイルからアクセスする例を紹介します。

GlobalData.swift

var sharedData: String = "共有データ"

Main.swift

import GlobalData

print(sharedData) // 共有データを出力

上記のコードを実行すると、「共有データ」と表示されます。

これにより、GlobalData.swiftで宣言されたsharedDataが、Main.swiftからもアクセス可能であることがわかります。

○サンプルコード5:グローバル変数を利用したデータ保存

アプリケーションの動作中に一時的にデータを保存したい場合、グローバル変数を利用することで簡単に実現できます。

この例では、ユーザーのスコアを保持するためのグローバル変数を宣言し、それを更新する方法を紹介します。

var userScore: Int = 0

func addScore(point: Int) {
    userScore += point
    print("現在のスコアは\(userScore)点です。")
}

addScore(point: 100)
addScore(point: 50)

上記のサンプルコードを実行すると、最初に「現在のスコアは100点です。」と表示され、次に「現在のスコアは150点です。」と表示されることを期待します。

これにより、ゲームやアプリケーションの中でユーザーの進行状況やスコアを簡単に追跡・保存することができます。

○サンプルコード6:グローバル変数を使った設定変更

アプリケーションやゲームの中では、ユーザーの設定や環境に合わせて動作を変更する場面が多々あります。

グローバル変数を利用することで、簡単にそのような設定の変更や情報の保持を実現することができます。

下記のコードは、音量設定の例を取り上げ、グローバル変数での設定の変更を行うシナリオを表しています。

// グローバル変数として音量を宣言
var volumeLevel: Double = 0.5

// 音量を変更する関数
func changeVolume(to newVolume: Double) {
    if newVolume >= 0.0 && newVolume <= 1.0 {
        volumeLevel = newVolume
        print("音量を\(volumeLevel * 100)%に変更しました。")
    } else {
        print("0.0から1.0の間で音量を設定してください。")
    }
}

// 音量を変更
changeVolume(to: 0.8)

このコードでは、初期音量を50%(0.5)としています。そして、音量を変更するためのchangeVolume関数を提供しています。

0.0から1.0の間での値を引数として受け取り、適切な範囲内であれば音量を変更します。

上記のコードを実行すると、音量が80%に変更され、「音量を80%に変更しました。」という結果が得られます。

○サンプルコード7:グローバル変数を用いたアニメーション制御

多くのアプリケーションでは、グラフィカルな表現やアニメーションが使用されます。

グローバル変数を利用することで、アニメーションの速度や方向などを動的に変更することができます。

ここでは、アニメーションの速度を制御するためのシンプルな例を表しています。

// アニメーションの速度を表すグローバル変数
var animationSpeed: Double = 1.0

// アニメーション速度を変更する関数
func changeAnimationSpeed(to newSpeed: Double) {
    if newSpeed > 0 {
        animationSpeed = newSpeed
        print("アニメーションの速度を\(animationSpeed)倍に設定しました。")
    } else {
        print("正の数値でアニメーションの速度を設定してください。")
    }
}

// アニメーション速度を変更
changeAnimationSpeed(to: 1.5)

このコードでは、初期のアニメーション速度を通常の1.0倍としています。

そして、changeAnimationSpeed関数を使って速度を変更できるようにしています。

上記のコードを実行すると、アニメーション速度が1.5倍に変更され、「アニメーションの速度を1.5倍に設定しました。」という結果が得られます。

○サンプルコード8:クラスや構造体内でのグローバル変数の利用

Swiftでは、クラスや構造体はオブジェクト指向プログラミングの主要な要素として利用されます。

これらの中でグローバル変数を用いることで、さまざまなクラスや構造体間で共有する必要があるデータを効率的に管理できます。

しかし、クラスや構造体内でのグローバル変数の使用は、他の変数やメソッドとの衝突を避けるために注意が必要です。

下記のコードでは、クラス内でグローバル変数を利用して、全てのインスタンスで共有する情報を管理する方法を表しています。

// グローバル変数としてデフォルトの言語を英語として宣言
var defaultLanguage = "English"

// 言語設定クラス
class LanguageSettings {
    // クラス内部での言語設定
    var language: String

    // 初期化時にグローバル変数の値を利用
    init() {
        self.language = defaultLanguage
    }

    // 言語を表示する関数
    func displayLanguage() {
        print("現在の言語設定は\(self.language)です。")
    }
}

// インスタンスの生成と表示
let settings = LanguageSettings()
settings.displayLanguage()

このコードでは、グローバル変数としてデフォルトの言語を英語として設定しています。

LanguageSettingsクラスのインスタンスを生成する際に、初期化時にこのグローバル変数を使用して言語を設定しています。

この例では、デフォルトの言語設定を表示する関数を呼び出すと、「現在の言語設定はEnglishです。」という結果を得ることができます。

○サンプルコード9:グローバル変数を利用したエラーハンドリング

アプリケーションの開発時には、エラーハンドリングは避けて通れないテーマとなります。

Swiftでは、エラーハンドリングを行うための仕組みとしてthrowcatchを利用しますが、グローバル変数を併用することで、アプリケーション全体で共通のエラーメッセージやエラーコードを管理することができます。

下記のコードは、グローバル変数を利用してエラーメッセージを管理する例を表しています。

// グローバル変数としてエラーメッセージを定義
var commonErrorMessage = "不明なエラーが発生しました。"

enum CustomError: Error {
    case invalidInput
    case timeout
}

func process(input: Int) throws {
    if input <= 0 {
        throw CustomError.invalidInput
    }
    // その他の処理
}

do {
    try process(input: -1)
} catch CustomError.invalidInput {
    print(commonErrorMessage)
}

このコードでは、グローバル変数commonErrorMessageを使用して、エラーが発生した際の共通のエラーメッセージを定義しています。

そして、関数process内でエラーが発生した場合、この共通のエラーメッセージを出力しています。

この例を実行すると、「不明なエラーが発生しました。」という結果が得られます。

○サンプルコード10:動的に変わる値を持つグローバル変数の実装

アプリケーションの実行中に動的に変わる値を持つグローバル変数も実装することができます。

例えば、アプリケーションの動作状態やユーザーのアクションに応じて変わる設定値などを格納する場合に役立ちます。

下記のコードは、アプリケーションの動作モードを示すグローバル変数を動的に変更する例を表しています。

// グローバル変数としてアプリケーションの動作モードを宣言
var appMode: String = "Standard"

// 動作モードを変更する関数
func switchMode(to newMode: String) {
    appMode = newMode
    print("アプリケーションの動作モードを\(appMode)に変更しました。")
}

// 動作モードを変更
switchMode(to: "Maintenance")

このコードでは、初期のアプリケーションの動作モードを「Standard」として設定しています。

そして、switchMode関数を使用して動作モードを変更することができます。

上記のコードを実行すると、動作モードが「Maintenance」に変更され、「アプリケーションの動作モードをMaintenanceに変更しました。」という結果が得られます。

●グローバル変数の注意点と対処法

Swiftでグローバル変数を活用する際には、確かに多くの便益を享受できますが、その利点と同時にいくつかの重要な注意点も存在します。

これらの注意点を理解し、適切な対処法を身につけることで、グローバル変数をより効果的かつ安全に使用することができます。

○スコープと可視性

グローバル変数はアプリケーション全体で利用可能であるため、誤って変数の上書きや衝突が生じるリスクが高まります。

変数の命名には特に注意を払い、意味のある名前をつけることで、他の開発者もその変数の目的を理解しやすくなります。

○スレッドの安全性

マルチスレッド環境でグローバル変数に同時にアクセスする場合、データの不整合が発生する可能性があります。

Swiftでは、DispatchQueueを用いてスレッドセーフなアクセスを実現することが推奨されています。

下記のサンプルコードでは、DispatchQueueを使用してグローバル変数counterへのアクセスをスレッドセーフに行っています。

var counter = 0
let queue = DispatchQueue(label: "com.example.threadSafe", attributes: .concurrent)

func incrementCounter() {
    queue.sync {
        counter += 1
        print("カウンターが更新されました: \(counter)")
    }
}

このコードでは、queue.syncを用いることで、同時に複数のスレッドからcounterにアクセスされることを防いでいます。

このような実装を採用することで、データの競合や不整合を防ぐことができます。

○メモリ管理

グローバル変数はアプリケーションのライフサイクル全体にわたって生存します。

これにより、不要なデータがメモリ上に残存し、メモリリークを引き起こすリスクが高まります。

周期的に不要なデータをクリアするなどの工夫が求められます。

○テストの難易度の増加

グローバル変数の存在により、テストが複雑になる可能性があります。

ユニットテストを実施する際には、グローバル変数を適切に初期化し、テストの独立性を保つことが必要となります。

●グローバル変数のカスタマイズ方法

Swiftにおけるグローバル変数のカスタマイズは、開発者の要求やアプリケーションの特性に合わせて変数をより効果的に利用するための重要な手段です。

ここでは、Swiftでグローバル変数をカスタマイズする方法とその実践的なサンプルコードを紹介しています。

○デフォルト値の設定

Swiftでは、グローバル変数にデフォルト値を設定することができます。

これにより、初期化の際に特定の値を持つことを確実にすることができます。

var defaultSetting: String = "初期設定"

このコードでは、defaultSettingという名前のグローバル変数に”初期設定”という文字列をデフォルト値として設定しています。

○Computed Propertyを使用したカスタマイズ

Swiftのグローバル変数は、Computed Propertyを使用して値の取得や設定の際の動作をカスタマイズすることができます。

var computedValue: Int {
    get {
        return storedValue * 10
    }
    set(newVal) {
        storedValue = newVal / 10
    }
}
var storedValue = 5

このコードでは、computedValueを取得する際にstoredValueの10倍の値を返し、設定する際にはその値を10で割った値をstoredValueに格納しています。

これにより、変数の内部的な処理を隠蔽しつつ、外部からは簡単にアクセスすることができます。

○変数のLazy Initialization

lazyキーワードを使用することで、変数の初期化を遅延させることができます。

これにより、初期化に時間がかかるオブジェクトや、必要な時まで初期化を遅らせたい場合に有効です。

lazy var heavyData: [Int] = {
    var array = [Int]()
    for i in 0...10000 {
        array.append(i)
    }
    return array
}()

この例では、heavyDataという配列は、初めてアクセスされた時にのみ初期化されます。

まとめ

Swiftにおけるグローバル変数の活用は、プログラム全体でアクセス可能なデータを持つことを可能にします。

この記事では、Swiftでのグローバル変数の基本的な使い方から、応用例、注意点、さらにはカスタマイズ方法までを徹底的に解説しました。

グローバル変数は、そのアクセス性から使いやすさを感じるかもしれませんが、適切に使用しないとコードの管理やデバッグが難しくなる可能性があるため、注意が必要です。

特に、変数のスコープやアクセス制御、初期化のタイミングなどを意識して使用することで、効果的に活用することができます。

また、Swiftの強力な機能であるComputed Propertyやlazyキーワードを使用することで、グローバル変数の振る舞いをカスタマイズし、さらに高度な処理を実現することが可能です。

Swiftでのプログラミングにおいて、グローバル変数は一つの重要な要素です。

しかし、その強力さゆえの落とし穴も多いため、本記事で紹介した知識を基に、適切に活用してください。

これにより、Swiftの魅力を最大限に引き出すことができるでしょう。