永遠ログ:[Swift2]NSCalendarUnitの合成
Swiftは頻繁に文法が変わり、APIの変更もあるのだがこの回りはどんどん変わっている。Swift3ではほとんど書いていないので分からないのだが、Swift4で同じ事をしようとしたらまた変わっていた。Swift3でも同じようだ。
Dateから年・月・日などの数字だけを抜き出すときのこと。Objective-C時代は NSCalendarUnit だったが、それがSwift2では NSDateComonents を使うようになっていた。Swift4は Calendar.Compontent を使う。
例えば、ある日付データから何日かを取得するには以下を使う。
func component(Calendar.Component, from: Date) -> Int
Returns the value for one component of a date.
下記のように書くと、今日が7/29であれば、dayには29が入る。
let calendar = Calendar.current
let date = Date()
let day = calendar.component(.day, from: date)
一度に複数のコンポーネントを取得したいとき、例えば年・月・日であれば以下を使う。
func dateComponents(Set, from: Date) -> DateComponents
Returns all the date components of a date, using the calendar time zone.
let calendar = Calendar.current
let date = Date()
let dateComponents = calendar.dateComponents([.year, .month, .day], from: date)
let year = dateComponents.year
let month = dateComponents.month
let day = dateComponents.day
これはSwift4の書き方と同じ。だが、この Set
let flags = [.year, .month, .day]
このように定義すると、下記のエラーになる。それはもっとも。
error: type of expression is ambiguous without more context
let flags : Set<Calendar.Component> = [.year, .month, .day]
全体では以下となる。
let calendar = Calendar.current
let date = Date()
let flags : Set<Calendar.Component> = [.year, .month, .day]
let dateComponents = calendar.dateComponents(flags, from: date)
let year = dateComponents.year
let month = dateComponents.month
let day = dateComponents.day