为什么TimeZone的API与NSTimeZone有很大的不同?

比方说NSTimeZoneinit(name: String),TimeZone没有.

NSTimeZone具有缩写属性,而在TimeZone中,缩写是以日期为参数的函数(而nil不是选项)

推荐答案

Foundation框架提供了相当多的类型对,其中从原始Objective-C代码导入的原始NS前缀类型的API对于SWIFT来说并不是最优的.这些类型对包括

还有其他人.

TimeZoneNSTimeZone就是这样的一对,其中NSTimeZone是按原样expose 给SWIFT的Objective-C类型,而TimeZoneNSTimeZone左右的原生SWIFT包装器,具有更新的API.更新后的API故意不同,因为原始的OBJECT-C API在SWIFT中可能不是最优的.

例如,正如您所注意到的,NSTimeZone提供了abbreviation属性and-abbreviationForDate:方法,而TimeZone只提供了方法.需要注意的是,abbreviation属性只返回调用-abbreviationForDate:的结果,传入[NSDate now];也就是说,它的存在只是因为Objective-C不支持方法的默认参数,所以abbreviation是一种便利.然而,SWIFT有does个默认参数,所以TimeZone.abbreviation(for:)统一了这些参数:如果你想传递一个特定的Date,你可以,但你不一定要这样做.

成对类型上的不同API还有其他原因,如下所示:

  • -[NSTimeZone initWithName:]是一个名字不好的API:尽管它的参数被称为"name",但实际的参数应该是一个时区identifier,它具有完全不同的格式.这必须在NSTimeZone文档中的几个地方被调用(例如,"虽然许多NSTimeZone符号包括单词"name",但它们实际上指的是ID."),这不是很好:理想情况下,API应该自己说话.当TimeZone被引入时,基金会团队有机会改进API的名称,所以他们在TimeZone上引入了与TimeZone.init(identifier:)相同的初始值设定项

  • 按照可变集合的基础约定,NSData是一个immutable数据类型,在NSMutableData中有一个可变的对应物.除了NSMutableDataNSData的子类(NSData"class cluster")带来的复杂性之外,Swift不需要进行这种区分:当您使用值类型时,您不需要both个可变和不可变的变量-您可以使用var/let来实现可变.Data是一个value type实现,它将NSDataNSMutableData提供的接口统一到一个类型中(同时也go 除了一些缺点)

  • SWIFT中的许多语言功能很难在现有的Objective-C类型上复制,或者需要完全重新考虑类型及其接口才能在SWIFT中有效.NSAttributedString/NSMutableAttributedStringAttributedString的情况就是如此:NSAttributedString是一个极其动态的类型,几乎没有提供便利和安全的可用工具;AttributedString利用SWIFT提供的各种工具来提供类型安全、自动完成和许多必然需要完全不同的API图面的便利

总而言之,像这样的类型对的SWIFT变体提供的API比它的Objective-C对应的版本提供less个API的情况是非常罕见的-在API被删除的地方,几乎总是出于安全、人体工程学或更好的API的考虑.但总体而言,SWIFT变种通常具有重要的more项功能,即使访问这些功能的方式略有不同.

Swift相关问答推荐

为什么第二项任务不在第一项任务完成之前开始?(并发队列)

.onReceive NSWindow.CloseNotify是否会为App中的每个窗口调用?

显示第二个操作紧接在另一个操作后的工作表在SwiftUI中不起作用

SWIFT异步/等待,多个监听程序

将NavigationSplitView更改为NavigationStack

在NavigationStack上设置拐角半径:SwiftUI中的无响应内容视图区

快速更改tableView中的数据

当使用 CGFloat 而不是数字文字时,为什么 node 的位置会发生变化?

Swift - 订阅视图之外的绑定值

与 SwiftUI 中的 onChange 修饰符相比,objectWillChangeSequence 的目的是什么?

有什么方法可以快速为泛型参数分配默认值?

Vapor 4,如何按外键过滤?

如何在不阻塞 UI 更新的情况下使用 Swift Concurrency 在后台执行 CPU 密集型任务?

Swift 4 Decodable - 以枚举为键的字典

Swiftwhere数组扩展

UITableViewCell 不显示 detailTextLabel.text - Swift

如何在 Swift 中使用 Crashlytics 登录?

WKWebView 确实从本地文档文件夹加载资源

使用 swift IOS 使 UIBarButtonItem 消失

滑动侧边栏菜单 IOS 8 Swift