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

WBOY
Freigeben: 2016-06-20 12:39:21
Original
1259 Leute haben es durchsucht

给 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"}
Nach dem Login kopieren

添加构造器

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

extension ImageAsset { var image : UIImage { return UIImage(named: self.rawValue)! }}
Nach dem Login kopieren

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

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

extension UIImage { convenience init(asset: ImageAsset) { self.init(named: asset.rawValue)! }}
Nach dem Login kopieren

现在可以通过 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 }}
Nach dem Login kopieren

现在可以用上面的枚举构建 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)
Nach dem Login kopieren

无处不在地用 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)
Nach dem Login kopieren

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

总结

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

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!