枚举作为常量使用的一个小技巧

php中文网
发布: 2016-06-20 12:39:21
原创
1372人浏览过

给 swift.gg翻译文章的时候,顺着文中的链接又学习了两篇,现在翻译这么多篇也算有点心得了,也总结了一整套还算完备的理论,以后会找时间专门说说。

这篇很简单,大概记录下,就不逐句翻译了

众所周知,Swift 中的枚举类型比 OC 强大多了。今天介绍一种拿枚举当做常量使用的小技巧。

为你的 Image Assets 添加枚举

以前创建图片都用 UIImage(named: "FooBar")这种方式,你需要记住一系列的 "foobar", "FooBar", "foo_bar", "foo-bar"图片名称,还要小心不要拼错了,毕竟没有自动补全。

当然你也可以定义一个常量 let FooBarImageName = "FooBar"避免拼写错误,但定义一个全局常量不酷啊,就算把他们都组织在一个全局范围的静态结构体中也不那么优雅。

接下来看看用 Swift 的 enum如何解决(enum 可以带一个 原始类型字符串

enum ImageAsset : String {    GreenApple = "green-apple"  Banana = "banana"  Pear = "pear"  Strawberry = "1-strawberry"  Strawberries = "strawberry-basket"}
登录后复制

添加构造器

既然我们需要 image,就添加一个计算属性

extension ImageAsset {    var image : UIImage {    return UIImage(named: self.rawValue)!  }}
登录后复制

现在调用 ImageAsset.GreenApple.image就能得到一个 UIImage,不会拼错,提供自动补全。

既然是创建图片,那我们连 UIImage 也一同改造了吧,加个构造器

商汤商量
商汤商量

商汤科技研发的AI对话工具,商量商量,都能解决。

商汤商量 36
查看详情 商汤商量
extension UIImage {    convenience init(asset: ImageAsset) {    self.init(named: asset.rawValue)!  }}
登录后复制

现在可以通过 UIImage(asset: .GreenApple) 获得图片了

为你的 UIColors 添加枚举

UIColors的本质其实可以表示 RGBA 的十六进制数( ffcc00ff),所以我们用 UInt32 的枚举类型来表示颜色:

extension UIColor {    enum ColorName : UInt32 {    case Translucent = 0xffffffcc    case ArticleBody = 0x339666ff    case Cyan = 0xff66ccff    case ArticleTitle = 0x33fe66ff  }}
登录后复制

现在可以用上面的枚举构建 UIColor实例了,添加一个初始化,做点位运算:

extension UIColor {    convenience init(named name: ColorName) {    let rgbaValue = name.rawValue    let red   = CGFloat((rgbaValue >> 24) & 0xff) / 255.0    let green = CGFloat((rgbaValue >> 16) & 0xff) / 255.0    let blue  = CGFloat((rgbaValue >>  8) & 0xff) / 255.0    let alpha = CGFloat((rgbaValue      ) & 0xff) / 255.0    self.init(red: red, green: green, blue: blue, alpha: alpha)  }}UIColor(named: .ArticleBody)  
登录后复制

无处不在地用 enum常量

请跟我念 enum大法好!

Localizable.strings

创建一个 enum,然后在 String的 extension添加 convenience init,然后你就可以用 String(key: .Greetings)代替 NSLocalizedString("Greetings", comment: "")了。

UIStoryboard

有时你需要创建 UIStoryboard实例以及 UIViewControllers,为了避免使用全局常量(storyboardIDs/identifiers),可以用 enum的方式解决,改造之后的调用非常优雅:

let wizzardVC = UIStoryboard.Wizzard.initialViewController()  let msgCompVC = UIStoryboard.Message.Composer.viewController()  let tutorialVC = UIStoryboard.Tutorial.viewController(.QuickStart)  
登录后复制

观察上面的调用, Wizzard, Message, Tutorial分别对应一个 enum。你可以在 UIStoryboard中添加多个 enum,然后为每个分配一个 case入口。

总结

作者最后很贴心地写了一个库 “SwiftGen”,为你自动生成这个 enum,你只要在工程中导入就好了。

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号