Swift语法学习笔记2:流程控制

本篇是《Swift语法学习笔记》系列的第二篇文章,将涵盖以下内容:

  • 流程控制
- if语句
    - 一般使用方法
    - 三目运算符
    - 多个条件用逗号隔开
    - where详解
- for循环
    - 一般使用方法
    - 自定义递进序列
    - 遍历
- while语句
- repeat语句
- Switch语句
    - 一般使用方法
    - 字符串case分支

1 if语句

1.1 一般使用方法

Swift中的if语句必须包含一对花括号,即使只有一行语句。另外,if后紧跟的判断语句可以不用()括起来,具体如下所示:

let random = arc4random_uniform(10)
if random < 5 {
    print("Hi")
} else {
    print("Ho")
}

1.2 三目运算符

1.1小节的例子可以精简为:

let random = arc4random_uniform(10)
random < 5 ? print("Hi") : print("Ho")

或者

let random = arc4random_uniform(10)
print(random < 5 ? "Hi" : "Ho")

1.3 多个条件用逗号隔开

let dict = [0: "Red", 1: "Green", 2: "Blue", 3: "Green", 4: "Yellow"]
let color1 = dict[Int(arc4random_uniform(6))]
let color2 = dict[Int(arc4random_uniform(6))]
if let color1 = color1, color2 = color2 {
    // Executed only if both colors were not nil
    print("color1: \(color1), color2: \(color2)")
}

1.4 where详解

var optionName: String? = "Ricky"
if let name = optionName where name.hasPrefix("R"){
    print("\(name)")
}

例子中的if语句执行的是:把optionName的值赋予常量name,如果没有值将为false退出if。而where执行的是判断可选变量optionName的首字母是否为大写"R",如果为false将退出if。这两个语句放在一起时,可以理解为“&&”的条件。无论是前面的语句还是后面的where语句,只要其中一个不符合规则,将输出false退出if语句体。

2 for循环

2.1 一般使用方法

for var i = 0; i < 10; i++ {
    print(i)
}

或者

for i in 0..<10 {
    print(i)
}

在使用in格式的for循环时,循环条件的控制变量无需声明,可以直接使用。

2.2 自定义递进序列

需要用到“数字.stride”来产生递进序列:

1.stride(through: 5, by: 1)     // 1,2,3,4,5
1.stride(to: 5, by: 1)          // 1,2,3,4

应用到for循环中:

for i in 10.stride(through: 0, by: -2) {
    print(i)
}

2.3 遍历

遍历数组:

let strings = ["A", "B", "C"]
for string in strings {
    print(string)
}

遍历

Set:let strings = Set<String>(["A", "B", "C"])
for string in strings {
    print(string)
}

遍历字典:

let d = [ 0: "Red", 1: "Green", 2: "Blue"]
for key in d.keys {
    print("\(key) -> \(d[key])")
}

或者

for (key, value) in d {
    print("\(key) -> \(value)")
}

3 while语句

var i = 10
while i > 0 {
    print(i--)
}

4 repeat语句

var j = 10
repeat {
    print(j--)
} while j > 0

5 Switch语句

5.1 一般使用方法

let value = 11
switch value {
    case 2, 3, 5, 7, 11, 13, 17, 19:
        print("Count is prime and less than 20")
    case 20...30:
        print("Count is between 20 and 30")
    default:
        print("Greater than 30")
}
  • 建议使用default,因为假如在case中找不到任何的value的值,那么将会产生一个运行时错误;
  • 不允许使用空的case语句。

    switch (value) {
    case 2:
    case 3: // Illegal – previous case is empty.
    print("Value is 2 or 3")
    default:
    print("Value is neither 2 nor 3")
    }

上述代码是错误的,需要修正为:

switch (value) {
    case 2, 3:     // Correct: catches value 2 and value 3
        print("Value is 2 or 3")
    default:
        print("Value is neither 2 nor 3")
}

或者

switch (value) {
    case 2: fallthrough
    case 3:     // Illegal – previous case is empty.
        print("Value is 2 or 3")
    default:
        print("Value is neither 2 nor 3")
}

5.2 字符串case分支

let s = "Hello"
switch s {
    case "Hello":
        print("Hello to you, too")
    case "Goodbye":
        print("See you tomorrow")
    default:
        print("I don't understand")
}

或者

enum Status {
    case OK
    case ERROR(String)
}
let result = Status.ERROR("Network connection rejected")
switch (result) {
    case .OK:
        print("Success!")
    case .ERROR(let message):
        print("Ooops: \(message)")
}

由于编译器知道result是一个枚举类型,所以可以省略Status,但是不可以省略.。另外,编译器也知道这个枚举类型只有两个值,所以可以省略default语句。

参考文献

《Beginning iPhone Development with Swift 2 - Exploring the iOS SDK 》From page 777 to page 838.

联系作者

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容