2018年07月29日

[Swift4]Calendar.Compontentの合成

以前下記のような記事を書いた。

永遠ログ:[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




posted by 永遠製作所 at 12:49| 東京 🌁| Comment(0) | Swift | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。