枚举和 extension 都是 swift 中非常好用的特性。这里我们就来讨论一个应用的例子,供大家参考。

我们在开发 app 的时候,都会用到各种图片资源,而我们读取图片资源时主要是通过UIImage 来操作的。比如这样:

var icon = UIImage(named: "mushroom")

我们通过传入图片资源的名称来构造 UIImage,这个方法大家应该都很熟悉了。这样读取图片是挺方便的。但也有它的一些弊端。

比如我们每次读取图片,都需要手工的输入图片名。这样手动输入名称,就有几个弊端,首先我们很容易输入错误的名称,造成图片读取失败。在稍微复杂的工程中,这样就有可能会产生那些很难调试的bug。再有,这种随意输入的方式,会让我们项目中的资源文件缺乏结构性。

我们这里就可以用一个枚举来表示图片资源的名称,

enum AssetIdentifier : String {

        case Flower = "ic_flower"
case Mushroom = "ic_mushroom"
case Mario = "ic_mario" }

然后在我们构造 UIImage 的时候,我们将枚举的 rawValue 传递给构造方法:

var image = UIImage(named: AssetIdentifier.Mario.rawValue)

这样,就解决了硬编码图片名称的缺乏结构性的问题。但这样做还是有一些问题,比如每次都要写一个 rawValue 的这种写法比较奇怪。另外,

虽然我们用到了枚举,到我们实际传递的仍然是字符串。

关于枚举rawValue 的相关内容,请参看这篇关于枚举的介绍

那么接下来,我们还可以更进一步,我们定义 UIImageextension 让它可以直接通过枚举来进行初始化:

extension UIImage {

    enum AssetIdentifier : String {

        case Flower = "ic_flower"
case Mushroom = "ic_mushroom"
case Mario = "ic_mario" } convenience init!(assetIdentifier : AssetIdentifier) { self.init(named: assetIdentifier.rawValue) } }

我们定义了 UIImageextension 并重载了它的初始化方法,使用 AssetIdentifier 作为参数来标示图片资源。接下来我们就可以直接使用枚举来初始化图片资源了:

let mushroom = UIImage(assetIdentifier: .Mushroom)

相比之前直接用手写字符串的方式,代码的可读性和整体图片资源的结构性有了明显的提升。当然,我们这里的模式也有它自己有待完善的地方。比如每次我们新增一个图片资源,都要手工的在枚举中设置相应的枚举项,并指定对应关系。

这里给大家起到一个抛砖引玉的作用,相信各位的聪明才智能够继续发现更好的方法。

Gist: https://gist.github.com/swiftcafex/4c76e09c6eca588f9976

更多精彩内容,请扫码关注微信公众号

extension 的一个应用 - 优化图片的读取机制的更多相关文章

  1. 1个小时!从零制作一个! AI图片识别WEB应用!

    0 前言 近些年来,所谓的人工智能也就是AI. 在媒体的炒作下,变得神乎其神,但实际上,类似于图片识别的AI,其原理只不过是数学的应用. 线性代数,概率论,微积分(著名的反向传播算法). 大家觉得这些 ...

  2. php分10个不同等级压缩优化图片

    今天找到一个php写的压缩图片程序,可以分10个等级(0-9)来压缩,0等级时压缩比率不是很大,图片不会失真:随着压缩等级不断增大,图片会变得越来越不清晰,通常压缩后图片大小可以减少到原来的50%,压 ...

  3. 前端性能优化--图片处理(Css Sprites 与 base64)

    前言: 近期研究着前端性能的优化方面的知识,并以博客记之.之前有相同系列的文章(前端性能优化--图片懒加载(lazyload image)),这次继续是关于图片的处理,css sprites 和 ba ...

  4. Android开发——内存优化 图片处理

    8.  用缓存避免内存泄漏 很常见的一个例子就是图片的三级缓存结构,分别为网络缓存,本地缓存以及内存缓存.在内存缓存逻辑类中,通常会定义这样的集合类. private HashMap<Strin ...

  5. Expression Blend4经验分享:制作一个简单的图片按钮样式

    这次分享如何做一个简单的图片按钮经验 在我的个人Silverlight网页上,有个Iphone手机的效果,其中用到大量的图片按钮 http://raimon.6.gwidc.com/Iphone/de ...

  6. 一个伪ajax图片上传代码的例子

    一个伪ajax图片上传实现代码. 复制代码代码如下: <?php  if($_FILES){  ?>  <script>  window.parent.ajaxUploadPi ...

  7. 一个不错的图片滑动展示插件 anythingslider

    一个不错的图片http://css-tricks.com/anythingslider-jquery-plugin/ DEMO演示: http://css-tricks.github.io/Anyth ...

  8. 学习OpenSeadragon之一(一个显示多层图片的开源JS库)

    OpenSeadragon是一个可以显示多层图片(可放大缩小)的Web库,基于JavaScript,支持桌面和手机. 由于我项目需要,却没有找到任何中文教程,因此在官网上一边学习,一边总结于此. 官网 ...

  9. [置顶] ios 一个不错的图片浏览分享框架demo

    demo功能:一个不错的图片浏览分享框架demo.iphone6.1 测试通过.可以浏览图片,保存,微博分享到新浪,腾讯,网易,人人等. 注:(由于各个微博的接口有时候会有调整,不一定能分享成功.只看 ...

随机推荐

  1. 二模10day2解题报告

    T1.最多因子数(divisors) 给出范围l,r求其中约数和最大的最小整数. 非常深井冰的题目:如果特判加暴力的话分数低的可怜 AC做法要用到分解质因数和线性筛(这俩好写),然而,一个一个枚举还是 ...

  2. javascript设计模式-工厂模式

    简单工厂模式:使用一个类来生成实例. 复杂工厂模式:使用子类来决定一个成员变量应该是哪个具体的类的实例. 简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口.通过工 ...

  3. 实用防火墙(Iptables)脚本分析

    实用防火墙(Iptables)脚本分析 --Redhat,CentOS,Ubuntu等常见Linux发行版中都会预装Iptables防火墙,大多数初学者设置起来由于对这款软件比较陌生,设置起来比较困难 ...

  4. ionic ngcordova map 地圖

    幾乎每個APP都會有地圖 所以在這裏記錄一下 1.在index.html 中 <script src="https://maps.googleapis.com/maps/api/js? ...

  5. svn 检出代码报ssl错误问题的解决

    svn: OPTIONS of 'https://192.168.11.185/svn/ahwater-cloud': SSL handshake failed: SSL error: Key usa ...

  6. ArcGIS10.2最新全套下载地址

    http://www.tuicool.com/articles/VfaMfy 免责声明: 该链接来自于哥伦比亚大学或者牛津大学的网站链接, 下载 软件之前确保有正版的软件授权 ,本博客只是转载了网站链 ...

  7. CDbConnectionExt.php 23.2实现数据库的主从分离,该类会维护多个数据库的配置:一个主数据库配置,多个从数据库的配置

      <?php   /** * 实现数据库的主从分离,该类会维护多个数据库的配置:一个主数据库配置,多个从数据库的配置. * 具体使用主数据库还是从数据库,使用如下规则: * 1.CDbComm ...

  8. kafka概念

    一.结构与概念解释 1.基础概念 topics: kafka通过topics维护各类信息. producer:发布消息到Kafka topic的进程. consumer:订阅kafka topic进程 ...

  9. HBase -ROOT-和.META.表结构

    在HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入,删除,查询数据都需要先找到相应的RegionServer.什么叫相应的RegionServer?就是管理你要操 ...

  10. JSF Action 与ActionListener的区别

    JSF Action 与ActionListener的区别 标签: 杂谈    事件  检验  参数  事件产生  页面跳转  Action  有 无参数,不传入当前控件,有返回值    当铵钮被单击 ...