post Image
SwiftのフレームワークでBundleを取得する方法

とりあえずおさらい

Cocoa Touch Frameworkで初めて開発した時にハマるあるあるなのですが、UIImageを取得する際には、

public init?(named name: String)

ではなく、

@available(iOS 8.0, *)
public init?(named name: String, in bundle: Bundle?, compatibleWith traitCollection: UITraitCollection?)

を使用しなければなりません。

前者の方はメインのBundleからUIImageを取得するメソッドなので、メインであるアプリ側のBundleからUIImageを取得しようとしてしまいます。
メインのBundleがフレームワークのBundleではないので、フレームワーク側で前者を使用した場合、正しい画像取得ができなくなってしまうためです。

画像だけでなく、xibなどのリソースファイルをフレームワークのプロジェクト上で取得する際には、後者のような通常のアプリのプロジェクトで使用しているメソッドにさらにBundleを引数で指定するメソッドで取得しなければいけなかったりするので注意が必要です。

classでバンドルを取得する場合

フレームワーク上では、フレームワークのBundleを取得しなければならないことがわかったので、その取得方法について見ていきましょう。
classで取得する場合は以下のメソッドを利用します。

Bundle
public init(for aClass: Swift.AnyClass)

このメソッドを使用して以下の処理を実行すれば、classが所属するBundleを取得することが可能です。

FrameworkClassSample.swift
let bundle = Bundle(for: type(of: self))

enum・structの場合

Swiftでenumやstructの機能がかなり強化されたので、フレームワークでも使いたいパターンもあります。
その際もenumの値によって画像なんかをBundleから取得したいとかってよくあると思います。

そんな時、先ほどのclassで使用した方法は、あくまで、classが所属するBundleを取得するのでコンパイルエラーを起こしてしまいます。

そういう場合は、下記のように仮のクラスを作成して、そこからBundleを取得するのがいいのではないかと思います。

enum
enum hoge {

    case fuga
    case piyo

    var image: UIImage? {
        //仮のクラスを作ってそこからBundle取得する
        class dummyClass {}
        let bundle = Bundle(for: type(of: dummyClass()))

        switch self {
        case .fuga:
            return UIImage(named: "fugaImage", in: bundle, compatibleWith: nil)
        case .piyo:
            return UIImage(named: "piyoImage", in: bundle, compatibleWith: nil)
        }
    }
}
struct
public struct SampleStruct {
    var image: UIImage? {
        //仮のクラスを作ってそこからBundle取得する
        class dummyClass {}
        let bundle = Bundle(for: type(of: dummyClass()))
        return UIImage(named: "structImage", in: bundle, compatibleWith: nil)
    }
}

extension作ったよ

さすがに毎回仮のクラスを作るのは面倒なのでextension作ったよ。

Bundle+current.swift
extension Bundle {
    static var current: Bundle {
        class dummyClass{}
        return Bundle(for: type(of: dummyClass()))
    }
}
呼び出す時
let bundle = Bundle.current

『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。