Swift中的單例的實現方式

  單例在iOS平常開發中是一個很經常使用的模式。對於但願在 app 的生命週期中只應該存在一個的對象,保證對象的惟一性的時候,通常都會使用單例來實現功能。在OC單例的寫法以下:html

@implementation Singleton
+ (id)sharedInstance {
    static Singleton *staticInstance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        staticInstance = [[self alloc] init];
    });
    return staticInstance;
}
@end

  那麼在swift中,咱們怎麼寫單例呢。首先,單例必須是惟一的,在一個應用程序的生命週期裏,有且只有一個實例存在。爲了保持一個單例的惟一性,單例的構造器必須是私有的。這防止其餘對象也能建立出單例類的實例。爲了確保單例在應用程序的整個生命週期是惟一的,它還必須是線程安全的。swift

  那麼,根據OC的寫法,改編一下成爲Swift的單例應該這樣寫: 安全

class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var instance : Singleton? = nil
        }
        
        dispatch_once(&Static.onceToken) {
            Static.instance = Singleton()
        }
        
        return Static.instance!
    }
}

  這種寫法固然沒有錯,可是Swift固然有更簡潔的寫法:app

  結構體寫法:spa

class Singleton {
    class var sharedInstance: Singleton {
        struct Static {
            static let instance = Singleton()
        }
        return Static.instance
    }
}

  這種寫法是在Swift1.0版本的時候,必須的寫法,由於Swift1.0,類還不支持全局類變量。而結構體卻支持。線程

還有其餘的寫法htm

喵神推薦的寫法是:對象

private let sharedInstance = MyManager()
class MyManager  {
    class var sharedManager : MyManager {
        return sharedInstance
    }
}

點擊打開連接blog

還有沒有更簡單的寫法?有,下面一種:生命週期

class Singleton {
    static let sharedInstance = Singleton()
    private init() {} // 阻止其餘對象使用這個類的默認的'()'初始化方法
}

 畢竟Swift2.0剛出來不久,沒有像OC同樣,基本上全世界的開發者都是一個寫法,不少東西都要互相借鑑探討。感謝共享知識的全部人,感謝Google。

 

以上內容參考文章連接爲:swifter.tips ,swift308 ,stackoverflow

相關文章
相關標籤/搜索