Help us understand the problem. What is going on with this article?

自作ライブラリでリソースを扱う時に躓いたこと

More than 1 year has passed since last update.

自分で Cocoa Touch Framework を作った時に、実装面で躓いたことについてメモしておこうと思います。ライブラリでリソースを使うことはそんなにないと思いますが参考までに。

躓き1:画像が取得できない

Assetsに画像ファイルが存在していてかつ画像名も合っているはずなのに、UIImageがnilになってしまうということがありました。

ライブラリ内のswiftファイル
// assetにhogeという名前のimageはあるのにnilになる
let image = UIImage(named: "hoge")

どうしてだろうかと調べているうちにここらへんのstackoverflowに辿り着きました。
https://stackoverflow.com/questions/26782706/cocoa-touch-framework-assets-not-visible-in-app-project
https://stackoverflow.com/questions/25739762/load-image-from-ios-8-framework

先の呼び出し方だと内部的に main bundle を呼び出しており、framework の bundle を呼び出してくれないとのことなので、 bundle を指定する必要があります。ということで雰囲気こんなかんじのクラスを作りました。

final class FrameworkImage {
    static func getImage(name: String) -> UIImage? {
        return UIImage(named: name, in: Bundle(for: self), compatibleWith: nil)
    }
}

なので呼び出し側はこのようになります。

let image = FrameworkImage. getImage(name: "hoge")

躓き2:ローカライズファイルが読み込めない

もう一つの躓きはローカライズファイルです。通常と同じようにLocalizable.stringsを作って呼び出してみるものの、ローカライズされてくれません。

ライブラリ内のswiftファイル
// Localizable.stringsはあるのに翻訳されない
let localizedString = NSLocalizedString("key_string", comment: "")

こちらも同様に bundle が原因でした。

https://stackoverflow.com/questions/2335664/localization-of-strings-in-static-lib

ということで雰囲気こんなかんじのクラスを作りました。

final class LocalizedString {
    static func localizeString(str: String) -> String {
        return NSLocalizedString(str, tableName: nil, bundle: Bundle(for: self), value: str, comment: "")
    }
}

呼び出し側はこのようになります。

let localizedString = LocalizedString.localizeString(str: "key_string")
akatsuki174
iOS→Androidエンジニアになりました。それなりに使える言語はSwift, Objective-C, Kotlin, Java。 UX, データ分析, グロースハック, デザイン, 自然言語処理にも興味あり。 1分野に固まらず、いろんな分野のことについて書いていこうと思います。
techtrain
プロのエンジニアを目指すU30(30歳以下)の方に現役エンジニアにメンタリングもらえるコミュニティです。
https://techbowl.co.jp/techtrain/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away