NSCalendarクラスとCalendar構造体

投稿者: | 2017年2月28日

macOS 10.12からCalendar構造体が使えるようになりました。どちらもマニュアルには同じようなことが書いてあって、正直その違いがよくわかりません。

これまでの使い方としてはグレゴリオ暦のNSCalendarオブジェクトを生成して、そのコンポーネントを取得するというものでした。これをCalendarに置き換えるとほんの少しだけ表現が変わります。

$diff ~/datecount/datecount.swift ~/tmp/datecount.swift
10,11c10,11
<     let cal: NSCalendar = NSCalendar(identifier: NSCalendar.Identifier.gregorian)!
<     let components: DateComponents = cal.components([.year, .month, .day, .weekday], from:date)
---
>     let cal: Calendar = Calendar(identifier: Calendar.Identifier.gregorian)
>     let components: DateComponents = cal.dateComponents([.year, .month, .day, .weekday], from:date)

このソースは日数カウンターDatecountのものですが、コンパイル後のファイルサイズは20kBほど小さくなります。約24%の軽量化はデカいね。

$ ll ~/datecount/datecount*
-rwxr-xr-x 1 takeru staff 86488 Nov  3 07:56 datecount
-rwxr-xr-x 1 takeru staff  3800 Nov  3 07:56 datecount.swift

$ ll ~/tmp/datecount*
-rwxr-xr-x 1 takeru wheel 65924 Feb 28 07:23 datecount
-rw-r--r-- 1 takeru wheel  3793 Feb 28 07:22 datecount.swift

Swiftのクラスと構造体の違いを検索すると、参照渡しのクラスと値渡しの構造体というのが大きいみたいです。よくわかりませんね。少なくとも今回のCalendarの場合はインスタンスを一つしか生成しないのでどちらでもいいです。

というわけでCalendarへの置き換えをしつつオブジェクトをデバイス化してみるで見直した内容を踏まえて、次回以降Datecountに手を入れていきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です