Использование категории NSDate с Swift 3 Тип даты

У меня есть категория Obj-C на NSDate, и я пытаюсь использовать функции этой категории со структурой Swift Date.

Есть ли чистый способ сделать это без необходимости бросать каждый раз или создавать экземпляр NSDate из Date или какой-то уродливый другой взлом?

Или я придерживаюсь того, что должен определять мои объекты как NSDate вместо Date?

Apple упоминает здесь, что

Наложение Swift в рамки Foundation предоставляет структуру Date, которая соединяет класс NSDate. Тип значения даты предлагает ту же функциональность, что и ссылочный тип NSDate, и эти два могут быть взаимозаменяемы в коде Swift, который взаимодействует с API Objective-C. Это поведение похоже на то, как Swift соединяет стандартные строковые, числовые и типы коллекций с соответствующими классами Foundation.

так что мой вопрос в том, как я могу получить доступ к дополнительным функциям в моей категории NSDate с моими объектами Date с минимальным минимальным кодом?

Для справки, я использую Swift 3.

Ответ 1

Модифицированные типы Swift 3 реализуются посредством внутренней ссылки на соответствующий объект Objective-C. Таким образом, подобно принципу "состав над наследованием", вы можете объявить методы, которые вас интересуют, в Swift и просто переадресовать вызов.

Например, если у вас есть следующий метод в Objective-C:

@interface NSDate(MyAdditions)
- (NSString*)myCustomNicellyFormattedDate;
@end

вы можете добавить расширение к Date, которое просто выполняет броски и вперед:

extension Date {
    var myCustomNicellyFormattedDate: String { 
        return (self as NSDate).myCustomNicellyFormattedDate()
    }
}

Преимущество такого подхода заключается в том, что метод доступен как для Objective-C, так и для Swift, с небольшими накладными расходами и проблемами обслуживания. И самое главное, без дублирования кода.