2014-10-29 4 views
42

I'm следующие вместе с Bloc.io Swiftris tutorial, где они инициализирует дату по:NSDate() против NSDate.date() в Swift

lastTick = NSDate.date() 

, который вызывает ошибку компиляции:

'date()' is unavailable: use object construction 'NSDate()' 

Какие должно быть равно:

NSDate *lastTick = [NSDate date]; 

(от NSDate reference)

Яблоко изменил Swift interface to NSDate, так как я видел другие примеры, которые используют NSDate.date?

Это просто NSDate или вы не можете вызывать методы типа для любых API-интерфейсов Objective-C?

+5

В Objective-C '[NSDate date]' просто вызывает '[[NSDate alloc] init]'. Следовательно, вам не нужно вызывать 'NSDate.date()' в Swift. Просто вызов 'NSDate()' будет инициализировать объект даты с текущей датой. – ZeMoon

+0

@ZeMoon Почему вы удалили свой ответ? Я собирался это принять. – max

+0

Ну, я думал, что это скорее применяется как комментарий, но, по-видимому, этого было достаточно, поскольку ответ ... Удалил его, вы можете проголосовать, по крайней мере, если не согласитесь ...: D – ZeMoon

ответ

75

[NSDate date] является заводским методом для создания объекта NSDate.

Если вы читаете руководство "Использование Swift с какао и Objective-C", есть раздел о взаимодействии с Objective-C API:

For consistency and simplicity, Objective-C factory methods get mapped as convenience initializers in Swift. This mapping allows them to be used with the same concise, clear syntax as initializers.”

Excerpt From: Apple Inc. “Using Swift with Cocoa and Objective-C.” iBooks. https://itun.es/gb/1u3-0.l

Так фабричный метод:

[NSDate date] 

превращается в инициализаторе в Swift

NSDate() 

Это не просто NSDate, где вы найдете этот ра ttern, но в других API Cocoa с заводскими методами.

+0

Без сомнения, Apple не будет поставлять '[NSDate data]' в Objective-C, если бы класс был реализован из нового сейчас; ARC означает, что существует ограниченное дополнительное удобство в простых методах 'alloc] init] autorelease];' -style factory. – Tommy

8

В Objective-C [NSDate date] просто звонит [[NSDate alloc] init]. Следовательно, вам не нужно звонить NSDate.date() в Swift. Просто вызов NSDate() будет инициализировать объект даты с текущей датой.

11

Кажется, что NSDate() - новый синтаксис. Ранее NSDate.date() работал,

но теперь вы должны использоватьNSDate()

+1

Фактически 'NSDate.date()' дает мне ошибку компилятора. – max

+1

Да, старый синтаксис больше не поддерживается – ChikabuZ

+0

@ChikabuZ Ваша плохая фраза вводит в заблуждение. Если вы имели в виду, что «ранее« NSDate.date() «работал», то не пишите «раньше» NSDate.date() 'works", потому что они означают совершенно разные вещи. –

6

Did Apple change the Swift interface to NSDate ?

Да, они сделали. Для меня компилятор рассказывает:

Foundation.NSDate:3:26: note: 'date()' has been explicitly marked unavailable here:

@objc(date) class func date() -> Self!

Значит, это явно не доступно для Swift. Это означает, что он официально устарел.

+0

Есть ли какая-то настройка в Xcode для получения сообщений об амортизации? – max

+0

@papirtiger Извините, я не понимаю, о чем вы говорите - ошибки компилятора отображаются по умолчанию в Xcode (насколько я знаю, в любом случае ... Я не использую Xcode.) –

+0

Я получаю только дату '() 'недоступно: используйте конструкцию объекта NSDate()' 'в Xcode. Какой компилятор вы используете? – max