注意: この記事は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よりもかなり簡潔に実装可能、なおかつイニシャライザーを隠蔽することができる。これによって、厳密なシングルトンパターンを実現できるようになっている。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。