iOS模块化中的通用图片访问器

前言

本文旨在解决,多模块、多 bundle 的图片资源的统一访问方法。

目前,我们开发的项目实现了模块化,不同模块使用的图片资源也都抽到了相应的模块内部,可以共用的图片资源和资源访问器,单独封装成一个基础模块。图片资源使用 xcassets 进行管理,模块通过 Cocoapods 进行管理。需要在每个模块中的 podspec 这样定义资源包:

s.resource_bundle = {
  'ModuleName' => ['Resources/*']
}

这样定义的好处是,pod 会将资源打包成模块同名的 bundle 文件。不会将资源整合到 main bundle ,这样也可以避免命名冲突的问题。

当然,如果你喜欢的话,你也可以选择另一种方式,将所有的资源整合到 main bundle 。那么,你可能就没有从非 main bundle 取图片的烦恼,你也可以关闭这篇文章了。

在介绍这个访问器之前,有必要介绍下 Swift 的下标语法,我在 Swift 中实现的图片资源访问器是基于此语法进行设计。

Subscript-下标语法

下标语法可以定义在类、结构体和枚举中,是访问集合、列表或序列中元素的快捷方式。可以使用下标的索引,设置和获取值,而不需要再调用对应的存取方法。

在使用 Swift 进行开发时,下标语法几乎每天都会用到,比如我们从数组中取一个元素:

let item = array[i]

从字典中通过 key 来取值:

let value = dict["key"]

下标允许你通过在实例名称后面的方括号中传入一个或者多个索引值来对实例进行查询。它的语法类似于实例方法语法和计算型属性语法。定义下标使用 subscript 关键字,与定义实例方法类似,都是指定一个或多个输入参数和一个返回类型。与实例方法不同的是,下标可以设定为读写或只读。这种行为由 getter 和 setter 实现,类似计算型属性:

subscript(index: Int) -> Int {
    get {
      // 返回一个适当的 Int 类型的值
    }
    set(newValue) {
      // 执行适当的赋值操作
    }
}

newValue 的类型和下标操作的返回类型相同。如同计算型属性,可以不指定 setter 的参数(newValue)。如果不指定参数,setter 会提供一个名为 newValue 的默认参数。

如同只读计算型属性,对于只读下标的声明,你可以通过省略 get 关键字和对应的大括号组来进行简写:

subscript(index: Int) -> Int {
    // 返回一个适当的 Int 类型的值
}

更多关于下标语法的信息,你可以通过这个链接了解更全面的信息。

使用下标语法实现通用的图片访问器

这里,其实是利用了下标的多维特性来实现。一个类型可以定义多个下标,通过不同索引类型进行对应的重载。

多维特性示例:

subscript(row: Int, column: Int) -> Double {
    get {
        assert(indexIsValid(row: row, column: column), "Index out of range")
        return grid[(row * columns) + column]
    }
    set {
        assert(indexIsValid(row: row, column: column), "Index out of range")
        grid[(row * columns) + column] = newValue
    }
}

最终实现大概如下:

public struct MyImage {
    /// 通过图片名,获取一个 UIImage
    public static subscript(named: String) -> UIImage? {
        UIImage(named: named)
    }
  
    /// 通过 module 和图片名,获取一个 UIImage
    public static subscript(module: Any.Type?, named: String) -> UIImage? {
        var buldel: Bundle?
        if let module = module {
            buldel = Bundle.named(String(describing: module.self))
        }
        return UIImage(named: named, in: buldel, compatibleWith: nil)
    }
}

用法:

// 从 ModuleName.bundle 中获取图片
MyImage[ModuleName.self, "image name"]

// 或者,从 main bundle 中获取图片
MyImage["image name"]

结语

以上就是一个通用的图片访问器的简单实现,这只是一个基础版本,可以支持 pngjpg 格式的图片访问了,基本满足我们的需求。

由于项目需要,我的项目中,对其进行了扩展,使其可以访问诸如 webpgif 等其他格式文件。

对于共用的图片资源,我们可以封装在 MyImage 模块下,通过脚本生成类似于下面这样的文件:

extension MyImage {

    public static iconX = MyImage[MyImage.self, "icon name"]
  
    ...
}

访问这些共用的资源,只需要这样使用即可:

MyImage.iconX

另外,想要提的一点是,并不是所有的多个模块使用的图片,都适合放到这个基础组件中,这个需要各位自己权衡。比如导航上面的按钮,一些返回按钮或者箭头之类的就很适合放在这里面。


如果这篇文章对你有帮助,不妨随手点个赞!谢谢❤️

⚠️原创,禁止未授权转载,只接收链接转载,不接受内容拷贝转载!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容