使用带有Swift 3 Date类型的NSDate类别

sta*_*886 11 objective-c nsdate objective-c-category swift swift3

我有一个Obj-C类别NSDate,我正在尝试使用Swift的Date结构来使用该类别中的函数.

有没有一个干净的方法来做到这一点,而不必每次都投出或不得不创建NSDate实例Date或一些丑陋的其他黑客?

或者我不得不将我的对象定义为NSDate而不是Date?

苹果提到这里

Swift覆盖到Foundation框架提供了Date结构,它结合了NSDate类.Date值类型提供与NSDate引用类型相同的功能,并且这两者可以在与Objective-C API交互的Swift代码中互换使用.此行为类似于Swift如何将标准字符串,数字和集合类型桥接到其对应的Foundation类.

,所以我的问题是如何使用干净的最小代码访问我的NSDate类别中的额外函数Date

作为参考,我使用的是Swift 3.

Cri*_*tik 6

Swift的3种桥接类型是通过对相应Objective-C对象的内部引用实现的.因此,类似于"基于继承的组合"原则,您可以在Swift中声明您感兴趣的方法,并简单地转发调用.

例如,如果Objective-C中有以下方法:

@interface NSDate(MyAdditions)
- (NSString*)myCustomNicellyFormattedDate;
@end
Run Code Online (Sandbox Code Playgroud)

您可以添加一个扩展名Date,只需转换和转发:

extension Date {
    var myCustomNicellyFormattedDate: String { 
        return (self as NSDate).myCustomNicellyFormattedDate()
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是可以在Objective-C和Swift中使用该方法,只需很少的开销和维护麻烦.最重要的是,没有代码重复.