Код Obj-c для Swift - NSDateFormatter
Я пытаюсь создать форматировщик даты, который загружается лениво и инициализируется только один раз. В Swift, если вы создаете переменную глобально, она автоматически загружается медленно, поэтому об этом позаботятся. Но как мне создать его только один раз в поточно-ориентированном виде? Я нашел этот код obj-c:
(NSDateFormatter *)formatter {
static NSDateFormatter *formatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_formatter = [[NSDateFormatter alloc] init];
_formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";
});
return formatter;
}
Но у меня возникают проблемы при воссоздании этого в Swift, поскольку статические переменные могут быть объявлены только для типа, а не для вычисляемого свойства или функции. Означает ли это, что я могу воссоздать его только как класс?
РЕДАКТИРОВАТЬ
Я знаю, как создать синглтон как класс, мне было больше интересно, есть ли более простой способ использовать синглтон (глобальное вычисляемое свойство против класса). Но, если подумать, класс в любом случае, вероятно, лучше, а его одноэлементная реализация очень проста.
1 ответ
Я думаю, что нечто подобное может сделать работу за вас:
func formatter() -> NSDateFormatter! {
struct myStatic {
static var dateFormatter: NSDateFormatter? = nil
static var token: dispatch_once_t = 0;
}
dispatch_once(&myStatic.token) {
myStatic.dateFormatter = NSDateFormatter();
myStatic.dateFormatter?.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
}
return myStatic.dateFormatter;
}
или альтернативно:
lazy var formatter: NSDateFormatter = {
let dateFormatter: NSDateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
return dateFormatter
}()