在 Swift 中,"普通"switch 分支结构长这样:
- func nameOfIndex(index:Int)->String {
- var str:String
- switch index {
- case 1:
- str = "One"
- case 2:
- str = "Two"
- default:
- str = "None"
- }
- return str
- }
细心的你一定会指出, 哥们, 你这代码有错误吧, 没加 break 呀?
你没错, 不过我也没错, 在 Swift 中, 每个 case 不加 break, 也不会自动执行下一个 case 块, 可以省去 break 的同时, default 默认处理块却不允许省略:
default 默认处理块不允许省略
看到这里, 是不是感到 Chris Lattner 大神简直把编程老师的尊尊教诲直接设计进了 Swift 语法, 要知道他老人家可是 Clang 编译器的作者, C 语言用的飞起, 想必他是吃够了 break 和 default 的苦呀.
Chris Lattner: 哀家还不老, 身材棒棒哒
大神可没有在这里停下脚步, 于是他又端上一道好菜:
- func priceOfCombo(name:String)->Float {
- var price:Float = 0.0
- switch name {
- case "Roasted chicken burger combo":// 黄金烤鸡腿堡套餐
- price = 22
- case "Mini burger combo":// 田园脆鸡堡餐
- price = 18
- case "Extra tasty crispy burger combo":// 劲脆鸡腿堡餐
- price = 22
- case "Zinger burger combo":// 香辣鸡腿堡餐
- price = 22
- case "Mexican Twister combo":// 墨西哥鸡肉卷餐
- price = 17
- case "Dragon Twister combo":// 老北京鸡肉卷餐
- price = 17
- case "Bucket meal":// 外带全家桶
- price = 96.0
- case "Kid's meal":// 快乐儿童餐
- price = 74.5
- default:
- price = 0.0
- }
- return price
- }
是的, 你没看错, case 的条件可以用字符串了, 从此和字典的 Key 可以无障碍勾搭在一起了.
以为这就够了 (反正我当时是心满意足了), 结果还有加餐:
- var speed = 50
- switch speed {
- case 0:
- print("stop")
- case 0...40:
- print("slow")
- case 41...70:
- print("normal")
- case 71..<101:
- print("fast")
- default:
- print("not classified yet")
- }
嗯, case 条件还可以是一个范围:
41...70 表示从 41 到 70, 包括 41 和 70;
71..<101 表示从 71 到 69, 不包括 101.
这在 OC 里是无法想象的事情了.
同样无法想象的还有:
- switch index {
- case 1, 2, 3:
- str = "Small"
- case 4, 5, 6:
- str = "Big"
- default:
- str = "None"
- }
一个 case 条件中, 可包含多个并列条件.
好了, 到这里一个优秀又严谨的 switch 介绍完了, 大神到底是 C 家出生, 还是没有忘记 C 语言的一些灵活性, 如果你确实需要连续执行两个 case 块, 还是可以用 fallthrough 来达到 "穿透" 效果的:
- let index = 1
- switch index {
- case 1:
- str = "One"
- fallthrough
- case 2:
- str = "Two"
- default:
- str = "None"
- }
上面例子中 str 最后的值为 "Two".
从 switch 设计可以看出, 大神对 Swift 的期望
既保持编写代码的灵活性, 又将传统语言的一些编程 "习惯" 规范化, 减少语法本身带来的失误.
令无数开发者对 Swift 的未来充满期待.
思考题
你在使用 Swift 中, 有没有发现让你会心一笑的设计? 带着发现的眼光去学习, 才能迅速进步哦, 期待你的留言.
来源: http://www.jianshu.com/p/071a25a588ad