2017-01-24 7 views
6

現在、​​を使用するプロジェクトを更新しています。プロジェクトはさまざまなフレームワークをインポートしており、フレームワークには画像が含まれています。Xcode8:フレームワークでイメージリテラルを使用する

フレームワークで、間違ったバンドルのイメージを探していたので、イニシャライザを無効にするために、UIImageの拡張子を宣言しなければなりませんでした。我々のようなものでした:

extension UIImage { 
    convenience init?(framework_named imageName: String) { 
     let bundle = Bundle(for: ClassNameInFramework.self) 
     self.init(named: imageName, in: bundle, compatibleWith: nil) 
    } 
} 

を私もフレームワークで画像リテラルを使用したいのですが、前のように、リテラルは画像とアプリケーションのクラッシュの間違ったバンドルを探しています。

誰かが知っていますか、画像を探すための画像リテラルをどのように指定するのですか?

+1

残念なことに指定できません。イメージリテラルは、メインバンドルを見る 'init(named:)'初期化子を呼び出します。 – dan

+1

@dan私はいくつかのドキュメントを教えてくれますか? – dirtydanee

答えて

3

非常に簡単な回避策を発見し、他の投稿のどこにも見つからないと驚いていました。私はそれがよりエレガントなことができますが、醜いUIImage(named:in:compatibleWith:)文字列型の初期化子を私の意見で使用するよりも好ましいです。 I代わりUIImageのラッパーを使用

struct WrappedBundleImage: _ExpressibleByImageLiteral { 
    let image: UIImage 

    init(imageLiteralResourceName name: String) { 
     let bundle = Bundle(for: ClassInFramework.self) 
     image = UIImage(named: name, in: bundle, compatibleWith: nil)! 
    } 
} 

我々は、基本的にそうように、Xcodeのタイプリテラル画像によって表現可能であるかどうかを決定するために使用するものである_ExpressibleByImageLiteralプロトコルを活用しますサブクラスは、より良い選択肢のように見えるでしょう。悲しいことに、UIImageのようなクラスはサブクラス化されていないので、頭を悩ますと頭がおかしくなります。

そして今、その使い方は次のようになります。

let image = (as WrappedBundleImage).image 

リテラル、通常の画像のように簡潔な、しかしまだ、コンパイル時には:)にチェックされていません。 asキャスティングを行うことを覚えておく必要があります。そうしないと、カスタムイニシャライザが呼び出されません。

extension UIImage { 
    static func fromWrappedBundleImage(_ wrappedImage: WrappedBundleImage) -> UIImage { 
     return wrappedImage.image 
    } 
} 

をそして、我々は今、このようにそれを使用することができます:

また、このような何かを行うことができ、このことができます

UIImage.fromWrappedBundleImage() 

希望を!

+0

それはかなりクールです、男。 –

+0

ありがとう@pallzoltan、私もそう思います。なぜ人々が答えを投票していないのか分からない。はい、それは通常イメージリテラルを使用するのと同じくらいきれいではないかもしれませんが、コンパイル時にチェックされるので、UIImage(named:in:compatibleWith:)を呼び出すよりもはるかに安全です...私の意見では、 (他のExpressibleByプロトコルとまったく同じように動作する)非常に不思議ではない_ExpressibleByImageLiteralプロトコルを使用したくないために、 "named:in:compatibleWith"イニシャライザを使用する必要があります。あなたはいつもフレームワークの中で、ランタイムの問題を常に防ぐために... – diegomontoyas

関連する問題