Swift中的單例的實現方式


  單例在iOS日常開發中是一個很常用的模式。對於希望在 app 的生命周期中只應該存在一個的對象,保證對象的唯一性的時候,一般都會使用單例來實現功能。在OC單例的寫法如下:

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

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

  那么在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當然有更簡潔的寫法:

  結構體寫法:

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

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

還有其他的寫法

喵神推薦的寫法是:

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

點擊打開鏈接

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

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

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

 

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

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM