
Swiftで便利に使えるキーワードのひとつが static です。
特に「クラスや構造体に関連する処理を、インスタンスを作らずに使いたい」という場面で役立ちます。
この記事では、static の基本的な意味や使い方、他との違い、活用シーン、注意点までをわかりやすく丁寧に解説します。
staticとは?
static は Swift におけるキーワードのひとつで、「型に属するプロパティやメソッド」を定義するために使います。
通常のプロパティやメソッドはインスタンスを生成してからアクセスしますが、static を付けたものは インスタンスを作らずに型から直接アクセス できます。
つまり、「その構造体(またはクラス)自体に紐づく処理やデータ」を表現したいときに使います。
具体例:定数や共通処理を定義する
下記は、static を使って定数とメソッドを定義した例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
struct MathUtility { static let pi = 3.14159 static func square(_ number: Double) -> Double { return number * number } } // 使用例 let area = MathUtility.pi * MathUtility.square(5) print(area) // 出力: 78.53975 |
上の MathUtility の例は、static を使って 定数や共通処理を「型そのもの」に結びつけている パターンです。
インスタンスを作らなくても使えることがポイントで、MathUtility.pi や MathUtility.square(5) のように、型名から直接アクセスできます。
もし、これをstaticを使わずに使う場合は下記のようにMathUtilityをインスタンス化して使う必要があります。
|
1 2 |
let math = MathUtility() print(math.pi) // インスタンスを作ってから使う |
指定の仕方
static はメソッド・プロパティ両方に対して使えます。
|
1 2 3 4 5 6 7 8 9 10 |
struct Config { static let appName = "MyApp" static var isDebugMode = false static func printAppInfo() { print("アプリ名: \(appName)") print("デバッグモード: \(isDebugMode)") } } |
また、列挙型でよく使われる static var allCases や、構造体での static func にも応用されます。
活用シーン
static は「インスタンスごと」ではなく「型そのもの」に結びつけたい値や処理を定義するときに使います。
つまり「共通のもの」「全体でひとつだけのもの」を表すのに適しています。
- ユーティリティ構造体の中で定数や共通関数を提供する
例:MathUtility.piやMathUtility.square()のように、共通の数値や計算式をまとめる。 - 共通の設定値やフラグを管理する
例:アプリ全体で使う API のエンドポイント URL、アプリのバージョン番号など。 - インスタンスごとではなく、全体で共通の情報を持ちたいとき
例:ゲームで「最高スコア」を全体でひとつだけ保持したい場合。 - SwiftUI の
Color.primaryやFont.largeTitleのようなプリセット定数を定義するとき
Apple が提供しているシステム定数もstaticを利用しており、インスタンス化せずにすぐ呼び出せるようになっています。
要するに、static は 「グローバルに使いたいものを型にまとめておく」 ための仕組みです。
もし「インスタンスごとに別の値を持ちたい」なら static をつけず、通常のプロパティやメソッドとして定義します。
class との違い:classキーワードとの使い分け
クラス(class)で static を使うと、そのプロパティやメソッドは「オーバーライド不可」になります。
一方で、class キーワードを使うことで「オーバーライド可能な型メソッド・プロパティ」を定義できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Animal { static func sayHello() { print("Hello from Animal") } class func makeSound() { print("Some sound") } } class Dog: Animal { // sayHello() はオーバーライド不可 // override static func sayHello() { ... } ← これはエラー override class func makeSound() { print("ワン!") } } |
つまり:
static→ 継承されても 上書き不可class→ 継承されて 上書き可能
という違いがあります。
プロジェクトで継承を意識する設計をしている場合は class を使うことがありますが、構造体や列挙体には static のみ使えます。
注意点
static は便利な一方で、次のような注意点があります。
- インスタンスごとの状態は持てない
staticは「型にくっついている」ので、ユーザーごと・画面ごとに違う値を持たせたいときには使えません。 - どこからでもアクセスできるため、使いすぎると管理が大変になる
便利だからと何でもstaticにすると「この値はどこで変わったの?」と追いにくくなり、コード全体が散らかりやすくなります。 - クラスではオーバーライドできない
staticを付けたメソッドはサブクラスで上書きできません。もしクラスの継承でオーバーライドしたいなら、classキーワードを使う必要があります。
つまり、「全体で共通していて変わらないもの」や「複数の場所から同じように使いたい処理」に絞って使うのがベストです。
まとめ
今回は Swift の static(型メソッド・型プロパティ)について詳しく紹介しました。
staticは型(構造体・列挙型・クラス)に属するメソッドやプロパティを定義するためのキーワード- インスタンスを生成せずに型名から直接アクセスできる
- 構造体・列挙体では
staticのみ、クラスではstaticorclassを選べる - クラスの
classキーワードはオーバーライド可能な型メンバを定義するために使う - 定数・共通処理・プリセット値・テスト用データなど、再利用性の高い場面で活用される
初心者の方もぜひ、共通処理や定数定義に static を活用してみてください。
コードがより整理され、読みやすくなりますよ!
