为什么 NSCalendar 有两个具有相似参数类型的 init 方法,它们接受日历标识符常量之一?

Why does NSCalendar have two init methods with similar parameter types that accepts one of the calendar identifier constants?

为什么 NSCalendar 有两个具有相似参数类型的 init 方法,它们都接受日历标识符常量之一?有两个 init 方法做完全相同的事情有什么意义?有谁知道为什么 Apple 会以这种方式将此信息添加到文档中,或者为什么 class 甚至以这种方式创建?

这是第一个初始化方法:

init?(calendarIdentifier ident: String)

这是第二个初始化方法:

init?(identifier calendarIdentifierConstant: String)

Link to Apple's NSCalendar Class Reference

这似乎是 Objective-C 接口的 Swift 2 导入中的错误。 在 Objective-C 中有 – 在 Foundation classes 中很常见 – 都是实例方法

- (id)initWithCalendarIdentifier:(NSString *)string
// Initializes a newly-allocated NSCalendar object for the calendar specified by a given identifier.

和一个class(工厂方法):

+ (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 一样 classes)。显然这不能正常工作,但结果 相同:

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 returns autorelease object 的便捷方法和 initWithCalendarIdentifier returns a +1 对象。 autorelease 对象和 +1 对象的区别如今几乎没有实际意义(并且只有在循环中分配和释放它们中的许多对象时才会真正发挥作用,而您不太可能这样做)这样做class)。

在Swift中,它们都解析为init?,第一个的参数为identifier,另一个的参数为calendarIdentifier.

注意,在Swift3中,消除了这个混淆,都转换成了init?(identifier:).