2016-11-30 3 views
0

Я пытаюсь создать экземпляр DateFormatter только один раз для класса, поэтому я не трачу кучу вычислительного времени на его выполнение для каждого экземпляра. В Obj-C я лениво создаю статическое свойство, чтобы выполнить это. Я пытаюсь понять, как это сделать в Swift, и большинство объяснений, которые я прочитал, точно не отвечают на этот вопрос.Static в ObjC vs Static in Swift

В Obj-C:

- (NSDateFormatter *)dateFormatter { 
    static NSDateFormatter *dateFormatter = nil; 
    if (!dateFormatter) { 
     dateFormatter = [[NSDateFormatter alloc] init]; 
     dateFormatter.dateStyle = NSDateFormatterMediumStyle; 
    } 
    return dateFormatter; 
} 

Swift перевод?

static var dateFormatter: DateFormatter { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .medium 
    return dateFormatter 
} 
+1

Вы можете позволить компилятору вывести перечисление : 'dateFormatter.dateStyle = .medium' – Alexander

ответ

3

Вы должны объявить статическую переменную на уровне класса:

class MyClass { 
    static var dateFormatter: DateFormatter = { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = DateFormatter.Style.medium 
     return dateFormatter 
    }() 
} 
2

Ленивый инициализируется статический постоянный без использования self в Swift является

static let dateFormatter: DateFormatter = { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .medium 
    return dateFormatter 
}() 

Тот же самый код (без static), поскольку свойство instance также является константой, но не будет инициализироваться лениво.

Однако ключевое слово static в коде ObjC немного вводит в заблуждение. 1: 1 эквивалентен коду ObjC является

lazy var dateFormatter: DateFormatter = { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .medium 
    return dateFormatter 
}() 

переменная инициализируется лениво, но это экземпляр недвижимости.

+0

так, я использую ленивую нотацию, но не ленивое ключевое слово? – Alex

+0

Из документации: * Сохраненные типы свойств лениво инициализируются при первом доступе. Они гарантированно будут инициализированы только один раз, даже если одновременно доступны несколько потоков, и их не нужно маркировать ленивым модификатором. * Свойства типа являются «статическими». – vadian

+0

Извините, я просто не знаком с терминологией. Вы говорите, что я пытаюсь создать свойство «хранимого типа»? Это создается с помощью этого синтаксиса, и я единственный, что делает «static», делает его ленивым, когда класс сначала создается/вызывается, а не при запуске? – Alex

0

В дополнении к ответу по @CodeDifferent, вы можете обернуть статические в class var, поскольку это позволит переопределить форматирование даты в подклассе:

class MyClass { 

    fileprivate static let mediumDateFormatter: DateFormatter = { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .medium 
    return dateFormatter 
    }() 

    class var dateFormatter: DateFormatter { 
     return mediumDateFormatter 
    } 
} 

class MyOtherClass: MyClass { 

    fileprivate static let shortDateFormatter: DateFormatter = { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = .short 
     return dateFormatter 
    }() 

    override class var dateFormatter: DateFormatter { 
     return shortDateFormatter 
    }  
}