在遷移之前斯威夫特3,我有以下代碼:不使用dispatch_once_t的轉換斯威夫特3碼
//Set up singleton object for the tracker
class func setup(tid: String) -> WatchGATracker {
struct Static {
static var onceToken: dispatch_once_t = 0
}
dispatch_once(&Static.onceToken) {
_analyticsTracker = WatchGATracker(tid: tid)
}
return _analyticsTracker
}
我收到以下錯誤:
'dispatch_once_t' is unavailable in Swift: Use lazily initialized globals instead
顯然,轉換工具轉換代碼如下:
class func setup(_ tid: String) -> WatchGATracker {
struct Static {
static var onceToken: Int = 0
}
_ = WatchGATracker.__once
return _analyticsTracker
}
而在我的課堂上,它增加了這個:
private static var __once:() = {
_analyticsTracker = WatchGATracker(tid: tid)
}()
但我仍然得到一個錯誤:
Instance member 'tid' cannot be used on type 'WatchGATracker'
TID被聲明爲:
fileprivate var tid: String
它曾經被聲明爲:
private var tid: String
我似乎無法弄清楚如何解決我的代碼,有沒有人有任何建議?
您不應該使用這種過時的方法創建單例,請查看[this one]這樣的教程(http://krakendev.io/blog/the-right-way-to-write-一個單身人士)的方式來做到這一點在斯威夫特。 – kabiroberai
那你爲什麼不用'lazy'呢? – holex
@holex - 令人煩惱的是,與'static'和全局變量不同,'lazy'不能確保線程安全,所以你必須實現你自己的同步機制。 – Rob