给 Swift.GG 翻译文章的时候,顺着文中的链接又学习了两篇,现在翻译这么多篇也算有点心得了,也总结了一整套还算完备的理论,以后会找时间专门说说。
这篇 很简单,大概记录下,就不逐句翻译了
众所周知,Swift 中的枚举类型比 OC 强大多了。今天介绍一种拿枚举当做常量使用的小技巧。
以前创建图片都用 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 也一同改造了吧,加个构造器
extension UIImage { convenience init(asset: ImageAsset) { self.init(named: asset.rawValue)! } }
现在可以通过 UIImage(asset: .GreenApple) 获得图片了
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
大法好!
创建一个 enum
,然后在 String
的 extension
添加 convenience init
,然后你就可以用 String(key: .Greetings)
代替 NSLocalizedString("Greetings", comment: "")
了。
有时你需要创建 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
,你只要在工程中导入就好了。