在 Cocoa/Cocoa Touch Framework 中, singleton 是很常見的設計模式。
Objective-C 的寫法
在 Objective-C 時,需要去考慮到 once token ,並用 dispatch once 去初始化他,如下:
@interface MyManager: NSObject {
+ (instancetype)sharedManager;
}
@implementation MyManager {
+ (instancetype)sharedManager {
static id _sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedManager = [[self alloc] init];
});
return _sharedManager
}
@end
基本的 Singleton
在 Swift 中就更簡單了,只要設定一個 let 變數,初始化完之後就不會再被變更了,如下
class MyManager: NSObject {
static let sharedManager = MyManager()
}
加上客製化設定
在許多情境設定好 singleton 物件後,需要去做進一步的設定。
這時候可以使用 closure (類似於 Objective-C 中的 block) 去封裝初始化物件的程式碼後,再將這個物件回傳。
取得回傳的物件之後,再把值設定回指定的屬性即可:
class MyManager: NSObject {
static let sharedManager: MyManager = {
// closure 裡面放置初始化的程式碼
let manager = MyManager()
// 進行進一步的設定
return manager
// 最後記得必須回傳這個物件
}() // 這一行的 () 就是觸發執行這個 closure 的方式
}