Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

メソッドも呼び出せる! Swiftの強力な「列挙型」

アップルの新プログラミング言語「Swift」を探検しよう 第3回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/07/10 14:00

 本連載では前回までに、Swiftの型と制御構造、関数、クロージャについて説明してきました。今回からは3回にわたり「クラス」「ストラクチャ」および「列挙型」を説明していきます。まず今回は列挙型と、値が存在しない可能性を示すことのできる「オプショナル列挙型」を説明します。Swiftの列挙型は他の言語のそれとは異なり、メソッドが定義できるなど多くの機能が備わっています。

目次

列挙型の性質

 Objective-Cを含め、多くのプログラミング言語における列挙型は、「Mondayは1、Tuesdayは2」という具合に、整数などを表すラベルを提供するような機能を持つことが一般的です。しかし、Swiftの列挙型は、他の言語のそれとは異なる性質を持っています。

 Swiftの列挙型では、メンバーがすべて同一の型を持つものとして扱われます。列挙型の値は、メンバーのいずれかになります。

 さらに、他の型と同様に、列挙型についても型推論によるコンパイル時エラーチェックが行われます。

 メソッドを定義することもでき、列挙型が現在とっているメンバーに応じた振る舞いを型に追加することができます。

 

Swiftの列挙型に固有の性質

  • メンバーに具体的な値を入れる必要がなく、メンバーそのものを値として扱えます。
  • 各メンバーに付随する型を入れられます。どのような型でも構いません。
  • メンバーに具体的な値を入れた場合はObjective-Cの列挙型(NS_ENUM)のように扱えます。
  • 列挙型自体を値型としてオブジェクトのように扱えます。メソッドも定義可能です。
 Swiftにおける型の扱いには、値型(Value Type)参照型(Reference Type)があると本連載第1回で述べましたが、列挙型として宣言した変数には、値(インスタンス)のコピーが渡されます。

 列挙型の宣言は、enumキーワードを使用して、次のように記述します。各caseの後に宣言される値がメンバーです。プロトコル準拠やインスタンスメソッドを使用できる点は、Swiftの列挙型が持つ特徴の1つです。

列挙型の宣言例
enum SampleEnum : SomeProtocol { // プロトコル準拠
    case Sample // メンバー
    case SampleAssociated(String) // メンバーに値を付随させる
    
    func printMember() { // インスタンスメソッド
        switch self {
        case .Sample: print("SampleMember")
        case .SampleAssociated: print("SampleAssociatedMember")
        }
    }
    
    static func printEnum() { // 型に紐ついたタイプメソッド
        println("SampleEnum")
    }
}

 

列挙型の機能と動作

 ここからは、次のように宣言したCustomResult列挙型を例に、Swiftの列挙型の機能とその動作の詳細を見ていきます。

enum CustomResult {
    case Success
    case Error
}

 

メンバーを変数に代入

 Swiftの列挙型では、メンバー自体を変数へ代入することができます。

var result = CustomResult.Error

 

 この時点でresult変数は、型推論によってCustomResult列挙型のメンバーのいずれかであるとみなされます。

 型が決定されていれば、CustomResultを省略して、ピリオドから同じ型のメンバーにアクセスすることができます。

result = .Success

 こちらではresultに代入できる値はCustomResult型であるという型推論がなされているため、このような代入方法をとることができます。

switch文と列挙型の併用

 switch文と列挙型を併用することで、ピリオド記法による条件判定が可能です。

 次のコードでは、switch文の網羅性の規則に準じ、result変数の値に応じて列挙型のすべてのメンバーに関する処理を入れています。

var result = CustomResult.Success
var content = 0
switch result {
case .Success: content = 1
case .Error: break
}
println(content) // 1

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • yad(ヤド)

    クラスメソッド株式会社のアプリケーションエンジニア。iPhoneアプリケーションの開発に2年以上従事している。開発に使用するObjective-Cのみならず、関数型言語Haskellや機械学習などにも関心がある。 「Developers.IO」に寄稿した記事の一覧

バックナンバー

連載:アップルの新プログラミング言語「Swift」を探検しよう
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5