Использование категории 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, с небольшими накладными расходами и проблемами обслуживания. И самое главное, без дублирования кода.