为什么NSCalendar有两个具有相似参数类型的初始化方法,都接受日历标识符常量之一?让两个init方法做完全相同的事情有什么意义?有谁知道为什么苹果会以这种方式将这些信息添加到文档中,或者为什么这样创建类的原因吗?
下面是第一个init方法:init?(calendarIdentifier ident: String)
下面是第二个init方法:
init?(identifier calendarIdentifierConstant: String)
链接到Apple的nscalcalendar类参考
这似乎是Swift 2导入Objective-C接口时的一个bug。在Objective-C中有-在基础类中很常见-两个实例方法
- (id)initWithCalendarIdentifier:(NSString *)string
// Initializes a newly-allocated NSCalendar object for the calendar specified by a given identifier.
和类(工厂方法):
+ (NSCalendar *)calendarWithIdentifier:(NSString *)calendarIdentifierConstant
// Creates and returns a new NSCalendar object specified by a given identifier.
和下面两个语句(几乎)是等价的:
NSCalendar *cal = [[NSCalendar alloc] initWithIdentifier:@"..."];
NSCalendar *cal = [NSCalendar calendarWithIdentifier:@"..."];
在Swift中只有初始化式,并且两者都应该被映射到相同的Swift初始化器(与其他Foundation的情况一样)类)。显然,这不能正常工作,但结果是相同的:
let cal1 = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese)
let cal2 = NSCalendar(identifier: NSCalendarIdentifierChinese)
print(cal1 == cal2) // true
在Swift 3中只有一个初始化式,取一个NSCalendar.Identifier
参数:
let cal = NSCalendar(identifier: .chinese)
(或新的值类型
)let cal = Calendar(identifier: .chinese)
在Objective-C中,有两种情况,calendarWithIdentifier
方便方法返回autorelease
对象,initWithCalendarIdentifier
返回+1
对象。autorelease
对象和+1
对象的区别现在几乎没有什么实际意义(实际上只有在循环中分配和释放它们中的许多对象时才会发挥作用,而在这个类中不太可能这样做)。
在Swift中,它们都解析为init?
,第一个参数为identifier
,另一个参数为calendarIdentifier
。
注意,在Swift 3中,这种混淆被消除了,两者都转换为init?(identifier:)
。