emahiro/b.log

Drastically Repeat Yourself !!!!

Bundleを使った画像のロードとキャッシュ from Apple公式チュートリアル

AppleiOS開発の公式チュートリアルに記載されている画像の読み込みについての備忘録。
画像はAssetsに入っているものとし、アプリ内で保持している画像を読み込むという前提。

対象箇所

Appleの公式チュートリアル「JumpRightIn」での画像を指定している箇所は以下。

// Load Button Images
let bundle = Bundle(for: type(of: self))
let filledStar = UIImage(named: "filledStar", in: bundle, compatibleWith: self.traitCollection)
let emptyStar = UIImage(named:"emptyStar", in: bundle, compatibleWith: self.traitCollection)
let highlightedStar = UIImage(named:"highlightedStar", in: bundle, compatibleWith: self.traitCollection)

画像の読み込みとキャッシュの方法について

定数ごとに考察していく。

let bundle = Bundle(for: (type: self)) について

これは、公式のリファレンスを参照すると省略せずに記載すると以下のようになる。

let bundle = Bundle.init(for: (type: self))

公式リファレンスには

//Creating and Initializing a Bundle

init(for: AnyClass)
Returns the NSBundle object with which the specified class is associated.

とあって、任意のクラスに関連する NSBundle オブジェクトを返す。

let **Star = UIImage(named:, in: bundle, compatibleWith: self.traitCollection) について

次にUIImageを初期化している箇所について触れていく。
UIImageの初期化の方法は省略せずに書くと以下

let **Star = UIImage.init?(named: String, in: Bundle?, compatibleWith: UITraitCollection?)

第1引数…Assetsに登録した名称を入れることでAssetsに登録した画像を使える。
第2引数…Bundleオブジェクトを指定することで画像をキャッシュできる。どういうことかというと、Bundleは入れ物オブジェクトのようなものなので、定義したBundleの中に、empty/filled/highlited の3つのステータスの画像を入れることで、3つの画像アセットをキャッシュすることができる。
第3引数…ここでのselfはRatingControlクラスそれ自体を表す。traitCollectionは該当の画像がUIStackViewに関連付けられているかを確認する(公式リファレンスだと、正確にするという訳がつけられる。)
ちなみにnilを入れることも可能であるが、nilの場合、RatingControlのStackViewではなく、この画面のUIView本体に紐づくので、ここではselfでRatignControlクラス自体を指定していると思われる。

参考

以下公式リファレンス参照
Bundle
UIImage
UIImage.init?
Array
enumrated