extension 的一个应用 - 优化图片的读取机制
枚举和 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的相关内容,请参看这篇关于枚举的介绍
那么接下来,我们还可以更进一步,我们定义 UIImage 的 extension 让它可以直接通过枚举来进行初始化:
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)
}
}
我们定义了 UIImage 的 extension 并重载了它的初始化方法,使用 AssetIdentifier 作为参数来标示图片资源。接下来我们就可以直接使用枚举来初始化图片资源了:
let mushroom = UIImage(assetIdentifier: .Mushroom)
相比之前直接用手写字符串的方式,代码的可读性和整体图片资源的结构性有了明显的提升。当然,我们这里的模式也有它自己有待完善的地方。比如每次我们新增一个图片资源,都要手工的在枚举中设置相应的枚举项,并指定对应关系。
这里给大家起到一个抛砖引玉的作用,相信各位的聪明才智能够继续发现更好的方法。
Gist: https://gist.github.com/swiftcafex/4c76e09c6eca588f9976
更多精彩内容,请扫码关注微信公众号

extension 的一个应用 - 优化图片的读取机制的更多相关文章
- 1个小时!从零制作一个! AI图片识别WEB应用!
0 前言 近些年来,所谓的人工智能也就是AI. 在媒体的炒作下,变得神乎其神,但实际上,类似于图片识别的AI,其原理只不过是数学的应用. 线性代数,概率论,微积分(著名的反向传播算法). 大家觉得这些 ...
- php分10个不同等级压缩优化图片
今天找到一个php写的压缩图片程序,可以分10个等级(0-9)来压缩,0等级时压缩比率不是很大,图片不会失真:随着压缩等级不断增大,图片会变得越来越不清晰,通常压缩后图片大小可以减少到原来的50%,压 ...
- 前端性能优化--图片处理(Css Sprites 与 base64)
前言: 近期研究着前端性能的优化方面的知识,并以博客记之.之前有相同系列的文章(前端性能优化--图片懒加载(lazyload image)),这次继续是关于图片的处理,css sprites 和 ba ...
- Android开发——内存优化 图片处理
8. 用缓存避免内存泄漏 很常见的一个例子就是图片的三级缓存结构,分别为网络缓存,本地缓存以及内存缓存.在内存缓存逻辑类中,通常会定义这样的集合类. private HashMap<Strin ...
- Expression Blend4经验分享:制作一个简单的图片按钮样式
这次分享如何做一个简单的图片按钮经验 在我的个人Silverlight网页上,有个Iphone手机的效果,其中用到大量的图片按钮 http://raimon.6.gwidc.com/Iphone/de ...
- 一个伪ajax图片上传代码的例子
一个伪ajax图片上传实现代码. 复制代码代码如下: <?php if($_FILES){ ?> <script> window.parent.ajaxUploadPi ...
- 一个不错的图片滑动展示插件 anythingslider
一个不错的图片http://css-tricks.com/anythingslider-jquery-plugin/ DEMO演示: http://css-tricks.github.io/Anyth ...
- 学习OpenSeadragon之一(一个显示多层图片的开源JS库)
OpenSeadragon是一个可以显示多层图片(可放大缩小)的Web库,基于JavaScript,支持桌面和手机. 由于我项目需要,却没有找到任何中文教程,因此在官网上一边学习,一边总结于此. 官网 ...
- [置顶] ios 一个不错的图片浏览分享框架demo
demo功能:一个不错的图片浏览分享框架demo.iphone6.1 测试通过.可以浏览图片,保存,微博分享到新浪,腾讯,网易,人人等. 注:(由于各个微博的接口有时候会有调整,不一定能分享成功.只看 ...
随机推荐
- 在 JNI 编程中避免内存泄漏
JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...
- 讲解DLL内容的比较详细的站点
1.通过 Visual Studio 2008 用C语言创建和调用DLL : http://blog.chinaunix.net/uid-631975-id-116622.html 2.DLL(Dyn ...
- 把jqmobi 變成jQuery 的插件 從此使用jQuery
因為項目的要求,需要用到jQuery 的一些插件 ,而我又是用jqmobi的....o(╯□╰)o 看看文檔.....把jqmobi 變成jQuery的插件 問題就解決了 O(∩_∩)O哈哈~ 官 ...
- Oracle笔记 九、PL/SQL 游标的使用
--演示隐式游标,系统自动声明,自动打开,自动使用并且自动关闭 begin update emp set sal = 1000; dbms_output.put_line('影响的行数:' || sq ...
- java 设计模式-代理
代理模式对其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式的思想 ...
- javascript之值传递与引用传递
在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference).在计算机科学里,这个部分叫求值策略(Evaluation Strat ...
- 必须会的SQL语句(五)NULL数据处理和类型转换
1.Null数据的处理 1)检索出null值 select * from 表 where xx is null 2)null值替换 sele ...
- ipv4、ipv6的socket同时监听“bind: Address already in use”的解决方法
创建ipv4和ipv6的socket,同时监听某个端口的ipv4和ipv6报文,运行时bind函数执行失败,提示“bind: Address already in use”.原因:ipv6的socke ...
- Arch 安装步骤
1.CFDISK 命令分区 一个主分区和一个逻辑分区 2.partprobe /dev/sdx 刷新分区表 3.mkfs 4. 5. 6.>dhcpcd 7. 8. 9. 10. 11. 12. ...
- 我都使用了这些VS插件
VS作为一个.net开发的必备工具,当然有必要将其打造成一个利器!所以,安装一些必要的插件来增强它是最佳的选择! 首先不得不说一下,Resharper太有用了! 接下来的这一些插件,对我来说,也都是比 ...