2016-08-28 3 views
3

なぜNSCalendarには、両方ともカレンダー識別子定数の1つを受け入れる類似のパラメータタイプを持つ2つのinitメソッドがありますか?まったく同じことをする2つのinitメソッドがある点は何ですか?誰がAppleがこの情報をドキュメントにこのように追加するのか、あるいはなぜこのクラスがこのように作成されたのかという背後にある理由を誰もが知っていますか?ここNSCalendarに、カレンダー識別子定数の1つを受け入れる類似のパラメータタイプを持つ2つのinitメソッドがあるのはなぜですか?

まずinitメソッドである:

init?(identifier calendarIdentifierConstant: String) 

Link to Apple's NSCalendar Class Reference

+0

@LeoDabus開発者が失敗しないenumバージョンの代わりに文字列バージョンを使用する理由はありますか? –

答えて

1

Objective-Cには、便利なメソッドautoreleaseオブジェクトとinitWithCalendarIdentifierという2つの表現があり、+1オブジェクトを返します。 autoreleaseオブジェクトと+1オブジェクトの区別は、現実的にはほとんど意味がありません(実際には、ループ内でそれらの多くを割り当てて解放している場合にのみ作用します。

スウィフトでは、両方ともinit?に解決されます。最初のパラメータはidentifierで、もう1つはパラメータcalendarIdentifierです。

注:Swift 3では、この混乱が排除されており、両方ともinit?(identifier:)に変換されています。

3

のスイフト2インポートのバグと思われる:ここ

init?(calendarIdentifier ident: String) 

は、第二のinitメソッドでありますObjective-Cインタフェース。 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. 

と次の2つのステートメントでありますほとんど)同等:スウィフトで

NSCalendar *cal = [[NSCalendar alloc] initWithIdentifier:@"..."]; 
NSCalendar *cal = [NSCalendar calendarWithIdentifier:@"..."]; 

のみイニシャライザあり、そして両方が同じに にマッピングされなければなりませんスウィフト初期化子(他のFoundation クラスの場合のように)。どうやらそれは正しく動作しませんが、結果 は同じです:

let cal1 = NSCalendar(calendarIdentifier: NSCalendarIdentifierChinese) 
let cal2 = NSCalendar(identifier: NSCalendarIdentifierChinese) 
print(cal1 == cal2) // true 

スウィフト3唯一の初期化子はNSCalendar.Identifier パラメータを取って、そこにある:

let cal = NSCalendar(identifier: .chinese) 

(または新しい値タイプ

let cal = Calendar(identifier: .chinese) 

(列挙パラメータを使用)。

関連する問題