iOSアプリ開発の逆引き辞典

iPhone/iPadで使えるアプリ開発のTipsをまとめてみました

NSNumber型で現在の年度を取得する

過去にObjective-CでNSCalendarクラスとNSDateComponentsクラスを使って、以下のような現在の年度をNSNumber型で取得するメソッドがありました。このメソッドを

- (NSNumber*)yearNumber
{
    NSCalendar* gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateComponents* comp = [gregorian components:NSYearCalendarUnit fromDate:[NSDate date]];
    return [NSNumber numberWithInteger:comp.year];
}

iOS 8 SDKを使ってビルドをすると、下記のようなワーニングが表示されるようになります。

example.m:164:74: 'NSGregorianCalendar' is deprecated: first deprecated in iOS 8.0 - Use NSCalendarIdentifierGregorian instead

example.m:163:49: 'NSYearCalendarUnit' is deprecated: first deprecated in iOS 8.0 - Use NSCalendarUnitYear instead

iOS 8.0以降、NSGregorianCalendarNSYearCalendarUnitの利用がdeprecated(非推奨)となりました。

iOS 7以前 iOS 8以降
NSGregorianCalendar NSCalendarIdentifierGregorian
NSYearCalendarUnit NSCalendarUnitYear

以下のように書き換えることが可能です。

- (NSNumber*)yearNumber
{
    NSCalendar* gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian] autorelease];
    NSDateComponents* comp = [gregorian components:NSCalendarUnitYear fromDate:[NSDate date]];
    return [NSNumber numberWithInteger:comp.year];
}

他にも名前が変わっている定義がいくつかあります。

iOS 7以前 iOS 8以降
NSGregorianCalendar NSCalendarIdentifierGregorian
NSYearCalendarUnit NSCalendarUnitYear
NSMonthCalendarUnit NSCalendarUnitMonth
NSDayCalendarUnit NSCalendarUnitDay
NSHourCalendarUnit NSCalendarUnitHour
NSMinuteCalendarUnit NSCalendarUnitMinute
NSWeekdayCalendarUnit NSCalendarUnitWeekday