为什么TimeZone
的API与NSTimeZone
有很大的不同?
比方说NSTimeZone
有init(name: String)
,TimeZone
没有.
NSTimeZone
具有缩写属性,而在TimeZone
中,缩写是以日期为参数的函数(而nil
不是选项)
为什么TimeZone
的API与NSTimeZone
有很大的不同?
比方说NSTimeZone
有init(name: String)
,TimeZone
没有.
NSTimeZone
具有缩写属性,而在TimeZone
中,缩写是以日期为参数的函数(而nil
不是选项)
Foundation框架提供了相当多的类型对,其中从原始Objective-C代码导入的原始NS
前缀类型的API对于SWIFT来说并不是最优的.这些类型对包括
还有其他人.
TimeZone
和NSTimeZone
就是这样的一对,其中NSTimeZone
是按原样expose 给SWIFT的Objective-C类型,而TimeZone
是NSTimeZone
左右的原生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
中有一个可变的对应物.除了NSMutableData
是NSData
的子类(NSData
是"class cluster")带来的复杂性之外,Swift不需要进行这种区分:当您使用值类型时,您不需要both个可变和不可变的变量-您可以使用var
/let
来实现可变.Data
是一个value type实现,它将NSData
和NSMutableData
提供的接口统一到一个类型中(同时也go 除了一些缺点)
SWIFT中的许多语言功能很难在现有的Objective-C类型上复制,或者需要完全重新考虑类型及其接口才能在SWIFT中有效.NSAttributedString
/NSMutableAttributedString
和AttributedString
的情况就是如此:NSAttributedString
是一个极其动态的类型,几乎没有提供便利和安全的可用工具;AttributedString
利用SWIFT提供的各种工具来提供类型安全、自动完成和许多必然需要完全不同的API图面的便利
总而言之,像这样的类型对的SWIFT变体提供的API比它的Objective-C对应的版本提供less个API的情况是非常罕见的-在API被删除的地方,几乎总是出于安全、人体工程学或更好的API的考虑.但总体而言,SWIFT变种通常具有重要的more项功能,即使访问这些功能的方式略有不同.