До перехода на Swift 3, я имел следующий код:Преобразование Swift 3 код без использования dispatch_once_t
//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
я не могу чтобы выяснить, как исправить мой код, есть ли у кого-нибудь предложения?
Вы не должны использовать этот устаревший метод создания одиночек в любом случае, проверить учебник как [этот] (http://krakendev.io/blog/the-right-way-to-write- a-singleton), чтобы сделать это в Swift. – kabiroberai
Почему вы не используете 'lazy' тогда? – holex
@holex - Раздражающе, в отличие от 'static' и globals,' lazy' не обеспечивает безопасность потоков, поэтому вам нужно реализовать свой собственный механизм синхронизации. – Rob