Код 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
}()
Другие вопросы по тегам