2016-08-28 1 views
3

Почему у NSCalendar есть два метода init с одинаковыми типами параметров, которые принимают одну из констант идентификатора календаря? Какой смысл иметь два метода init, которые делают то же самое? Кто-нибудь знает причины, почему Apple добавит эту информацию в документацию таким образом или почему класс даже создан таким образом?Почему у NSCalendar есть два метода init с аналогичными типами параметров, которые принимают одну из констант идентификатора календаря?

Вот первый метод инициализации:

init?(calendarIdentifier ident: String) 

Вот второй метод инициализации:

init?(identifier calendarIdentifierConstant: String) 

Link to Apple's NSCalendar Class Reference

+0

@LeoDabus Есть ли причина, по которой разработчик захочет использовать строчную версию вместо версии enum, которая никогда не сработает? –

ответ

1

В Objective-C, есть два выдач, calendarWithIdentifier удобный метод, который возвращает объект autorelease и initWithCalendarIdentifier, который возвращает объект +1. Различие объекта autorelease и объекта +1 имеет мало практических последствий в настоящее время (и действительно только вступает в игру, если вы выделяете и освобождаете многие из них внутри цикла, что вряд ли вы будете делать с этим классом).

В Swift оба они разрешают init?, первый - с параметром identifier, а другой - с параметром calendarIdentifier.

Примечание: в Swift 3 эта путаница устранена, оба преобразованы в init?(identifier:).

3

Это кажется ошибка в импорте Swift 2 из Интерфейс Objective-C. В Objective-C есть - у него обычно с классами Foundation - одновременно метод

- (id)initWithCalendarIdentifier:(NSString *)string 
// Initializes a newly-allocated NSCalendar object for the calendar specified by a given identifier. 

экземпляр и класс (метод фабрики):

+ (NSCalendar *)calendarWithIdentifier:(NSString *)calendarIdentifierConstant 
// Creates and returns a new NSCalendar object specified by a given identifier. 

и следующие два утверждения (почти) эквивалентны:

NSCalendar *cal = [[NSCalendar alloc] initWithIdentifier:@"..."]; 
NSCalendar *cal = [NSCalendar calendarWithIdentifier:@"..."]; 

в Swift есть только инициализаторы, и оба должны быть отображены к тому же Swift инициализатор (как в случае с другими базовыми классами ). Судя по всему, что не работает правильно, но результат идентичен:

let cal1 = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese) 
let cal2 = NSCalendar(identifier: NSCalendarIdentifierChinese) 
print(cal1 == cal2) // true 

В Swift 3 есть только один инициализатор, принимая NSCalendar.Identifier параметр:

let cal = NSCalendar(identifier: .chinese) 

(или новое значение тип

let cal = Calendar(identifier: .chinese) 

, который принимает параметр перечисления).

Смежные вопросы