2016-09-26 1 views
10

J'ai une catégorie Obj-C sur NSDate et j'essaie d'utiliser les fonctions de cette catégorie avec la structure Date de Swift.Utilisation de la catégorie NSDate avec Swift 3 Type de date

Existe-t-il un moyen propre de faire cela sans avoir à lancer à chaque fois ou avoir à créer NSDate instance de Date ou un autre hack laid? Ou est-ce que je suis obligé de définir mes objets comme NSDate au lieu de Date?

d'Apple mentionne que here

La superposition Swift au cadre Fondation fournit la structure de date, qui relie à la classe NSDate. Le type de valeur Date offre les mêmes fonctionnalités que le type de référence NSDate, et les deux peuvent être utilisés de manière interchangeable dans le code Swift qui interagit avec les API Objective-C. Ce comportement est similaire à la façon dont Swift relie les types de chaînes standard, numériques et collection à leurs classes Foundation correspondantes.

, donc ma question est de savoir comment puis-je accéder aux fonctions supplémentaires dans ma catégorie NSDate avec mes Date objets avec un minimum de code propre?

Pour référence, j'utilise Swift 3.

+1

Pour utiliser cette catégorie Objective-C 'NSDate', vous devez convertir votre objet' Date' en 'NSDate'. Ou vous pouvez réécrire votre catégorie comme une «extension» rapide à 'Date'. – Rob

Répondre

5

Swift sont mis en oeuvre de trois types pontés par l'intermédiaire d'une référence interne à leur objet Objective-C correspondant. Ainsi, de la même façon que le principe «composition par héritage», vous pouvez déclarer les méthodes qui vous intéressent dans Swift et simplement transférer l'appel.

Par exemple, si vous avez la méthode suivante en Objective-C:

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

vous pouvez ajouter une extension à Date qui jette simplement et vers l'avant:

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

Cette approche a l'avantage d'avoir la méthode disponible à la fois dans Objective-C et Swift, avec peu de frais généraux et de maintenance. Et le plus important, sans duplication de code.