Swift単例の4つの書き方

1718 ワード

第1種
この方法が一番簡単です.
import UIKit 
 

final class Single: NSObject {
var name: String = " " //
static let shared = Single()
private override init() {}
}


第2種
2つ目は完全にOCスタイルの一例ですが、Swift 3では元のdispatch_が廃棄されているためonce_t、だから先にDispatchQueueに1つのextensionを追加する必要があって、もとのdispatch_を実現しますonce_t効果
import UIKit 
 

final class SingleShare: NSObject {
var name: String = " "
static func shared() -> SingleShare {
struct Single {
static var single = SingleShare()
}
DispatchQueue.once(token: "SINGLE") {
Single.single = shared()
}
return Single.single
}
}

public extension DispatchQueue {
private static var onceToken = String
public class func once(token: String, block:@escaping () -> Void) {
objc_sync_enter(self)
defer {
objc_sync_exit(self)
}
if onceToken.contains(token){
return
}
onceToken.append(token)
block()
}

}

第3種
Swift 3では権限制御が強化されているため、private override init()メソッドを書き換えるとエラーが発生するため、この書き方のSwift 3での安全性は考察される.
private let single = Single3()
final class Single3: NSObject {
var name: String = " "
static var shared: Single3 {
return single
}
}

第四種
メソッド内で静的変数を定義します.
final class Single4: NSObject {
var name: String = " "
static var shared: Single4{
struct Static {
static let instance: Single4 = Single4()
}
return Static.instance
}
private override init() {}
}

注意:finalキーワードの役割は、このクラスまたはメソッドが継承および書き換えられないことです.