はじめに
前回までは、Swiftの文法や演算子について説明しました。連載第3回は、Swiftでのクラスやメソッドの作り方/使い方について説明します。
対象読者をObjective-Cが分かる方としている関係上、Objective-C自体の言語仕様やXcodeの使い方については解説を割愛する場合があることをご了承ください。同様にSwift自体の説明も必ずしも十分でない場合があります。そのような場合は末尾の参考文献等を参照してください。
対象読者
本記事は、次の方を対象にしています。
- Objective-Cの基本的なプログラムが出来る方
- Xcodeを使える方
クラス
Swiftのプログラムは、Objective-Cと同様にクラスという単位で構成されます。クラスの中で、オブジェクトの属性を保持するインスタンス変数と処理を定義するメソッドを定義します。
クラスの扱い
Objective-Cでは、クラスを定義する際に、ヘッダファイル/実装ファイルの2つのファイルが必要でした。Swiftでは、1ファイルでクラスを定義できるようになりました。2つのクラスを比較すると次のようになります。
@interface Cat : NSObject
{
    // インスタンス変数を定義
    NSString *catName;
    int catAge;
}
// プロパティを定義
@property(weak) NSString *name;
@property(assign) int age;
@end
  
#import "Cat.h"
@implementation Cat
@synthesize name=catName, age = catAge;
-(id)init {
	if ([super init]) {
  }
  return self;
}
@end
  同じ内容をSwiftで表したコードは、以下のとおりです。
// Catクラスを定義
class Cat : NSObject
{
    // プロパティ
    var Name:String    // 名前
    var Age:Int        // 年齢
    // 初期化処理
    init(name:String, age:Int)
    {
        Name = name
        Age = age
    }
    ...中略...
}
  Objective-Cでは、ヘッダファイル内にインスタンス変数にアクセスするプロパティを記述していたのに対し、Swiftでは、ヘッダファイルという概念がないのでインスタンス変数をプロパティとして扱えます。メソッドに関しても同様に、ヘッダファイルで宣言のみを行うこともありません。Swiftでは、クラスの扱いが非常に簡略化されています。
クラスの定義
クラスはclassで定義します。クラス名を「class」のあとに表し、中括弧内にプロパティやメソッドを定義します。クラスの書式は次の通りです。
[修飾子] class クラス名 [:スーパークラスやプロトコル]
{
    [プロパティ変数の定義]
    // 初期化処理の定義
    init( [引数] )
    {
        // 初期化処理の内容
    }
}
  修飾子には次のものがあります。
| 名前 | 概要 | 
|---|---|
| public | どこからでもアクセス可能、既定 | 
| private | クラスが定義されているソースコード内のみアクセス可能 | 
| internal | フレームワーク/モジュール内でアクセス可能 | 
上記の通り、Swiftでのクラスの定義はJavaやPHPに似ています。Objective-Cのような独特の表現がないため、非常にすっきりとしています。
初期化処理はinitメソッド内で行います。メソッドについては、次項で説明します。
具体的なクラスの例を次に挙げます。名前(Name)と年齢(Age)をプロパティに持つCatクラスは、次のように定義できます。継承するクラスや実装するプロトコルはクラス名の後ろに「:」をつけて名前を記述します。
// Catクラスを定義
class Cat : NSObject
{
    // プロパティ
    var Name:String    // 名前
    var Age:Int            // 年齢
    var Territory:String // 縄張り
    var Favorite:String // 好物
    // 初期化処理
    // 名前と年齢を引数で渡してセット
    init(name:String, age:Int)
    {
        Name = name
        Age = age
    }
...中略...
}
  プロパティに関しては、利用する変数を記述するのみで定義できます。その際にvar/letで変数/定数としての定義が可能です。

 
              
               
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                              
                               
                              
                               
                              
                               
                              
                               
                              
                               
                      
                     
                      
                     
                      
                     
                      
                     
                      
                     
                      
                     
                      
                     
															
														 
															
														 
															
														.png) 
     
     
     
     
     
													 
													 
													 
													 
													 
										
									
 
                     
                    