Objective-C/Swiftにおけるシングルトン定義備忘録

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

オブジェクト指向言語では、シングルトンパターンがしばしば使われる。iOSあるいはmacOSアプリで使われているObjective-CやSwiftではそれを実現する方法があり ((Objective-Cでは言語仕様の問題で不完全)) 、定義をすることができる。ここでは備忘録として定義方法を書いていきたい。

今回はSingletonInstanceというクラス名と仮定して行う。

Objective-C

Objective-Cでは以下の方法で実装することができる。

SingletonInstance.hファイル

#import <Foundation/Foundation.h>

@interface SingletonInstance : NSObject

@property (class, nonatomic, readonly, nonnull) SingletonInstance *sharedInstance;

@end

SingletonInstance.hファイル

#import "SingletonInstance.h"

@implementation SingletonInstance

- (instancetype)init {
    self = [super init];
    if (self) {
        // do something
    }
    return self;
}

+ (instancetype)sharedInstance {
    static SingletonInstance *_sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[SingletonInstance alloc] init];
    });
    return _sharedInstance;
}

@end

注意事項

Objective-Cで行う場合は、言語仕様の制約により、厳密なシングルトンパターンは実現できない。これは、Objective-Cではメソッドをprivateに指定できないことによるものであり、なおかつヘッダーファイルレベルで初期化を隠蔽できないことによるものである。

Swift

Swiftでは、以下の方法で実現可能である。

SingletonInstance.swift

import Foundation

class SingletonInstance {
    static let shared = SingletonInstance()
    private init() {
        // do something
    }
}

Swiftでは、Objective-Cよりもかなり簡潔に実装可能、なおかつイニシャライザーを隠蔽することができる。これによって、厳密なシングルトンパターンを実現できるようになっている。

タイトルとURLをコピーしました