为什么NSCalendar有两个参数类型相似的初始化方法,都接受一个日历标识符常量



为什么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:)

最新更新