【Swift】02-流程控制

if-else 条件语句

  • 在 Swift 中,if 后面的条件可以省略小括号
  • if 后面的条件只能是 Bool 类型(区别于OC的,零为假,非零为真)
let age = 20
if age >= 18 {
    print("成年人");
}

循环:while、repeat-while、for

  • 同 if 条件语句一样,循环条件可以省略小括号
  • repeat-while 相当于 C/OC 语言中 do-while
    注意:从 Swift 3 开始,去除了自增(++)、自减(--)运算符,是因为可读性不好。(如:++age + ++age,可读性不好,在不同编译器会有不同的效果)
var num = 5
while num > 0 {
    print("num is \(num)")
    num -= 1  // 注意:这里不能写 num--。
}   // 打印了5次

var count = -1
repeat {
    print("count is \(count)")
} while count > 0   // 打印了1次
  • 以前 C/OC 中的 for 循环写法:三段式
for (int i = 0; i < 5; i++) {
        
}
  • 常见遍历数组
// 1. 遍历数组
let names = ["张三", "李四", "王五", "赵六"]
for i in 0...3 {
    print(names[i])
}   // 张三 李四 王五 赵六

// 2. 遍历数组
let names = ["张三", "李四", "王五", "赵六"]
for name in names {
    print(name)
}   // 张三 李四 王五 赵六
  • Swift 中的 for 循环写法:区间式
    1)闭区间运算符:a...b(a ≤ 取值 ≤ b)
    2)半开区间运算符:a..<b(a ≤ 取值 < b),a<..b(a < 取值 ≤ b)
    3)单侧区间运算符:a...(a ≤ 取值),...b(取值 ≤ b),..<b(取值 < b);就是让区间朝一个方向尽可能的远,可能是无穷远,也可能是数组的长度。
let names = ["张三", "李四", "王五", "赵六"]
for i in 0...3 {
    print(names[i])
}   // 张三 李四 王五 赵六


let range = 1...3
for i in range {
    print(names[i])
}   // 李四 王五 赵六


let a = 1
let b = 2
for i in a...b {
    print(names[i])
}   // 李四 王五


// i 默认是 let,有需要时可以声明为 var,可以对 i 的值进行修改
for var i in 1...3 {
    i += 5
    print(i)
}  // 6 7 8


// 如果 for 循环中用不到 i,可以写成“_”表示忽略
for _ in 0...3 {
    print("for")
}  // 打印了3次

// 半开区间运算符:1 ≤ 取值 < 5
for i in 1..<5 {
    print(i)
}  // 1 2 3 4


// 区间运算符用在数组上
let names = ["张三", "李四", "王五", "赵六"]
for name in names[0...3] {
    print(name)
}  // 张三 李四 王五 赵六

// 由于数组边界的限制,区间等价于: [0...3]
for name in names[...3] {
    print(name)
}   // 张三 李四 王五 赵六


// 带间隔的区间值
let min = 4
let max = 11
let interval = 2
// i 的取值:从4开始,累加2(即间隔2),不超过11
for i in stride(from: min, through: max, by: interval) {
    print(i)
}   // 4 6 8 10

区间类型

除了Int类型的区间,字符、字符串也能使用区间运算符,但默认不能用在 for-in 中
区间也有类型,如:

// 1.闭区间
let range1: CloseRange<Int> = 1...3
let range1 = 1...3    // 简写

// 2.半开区间
let range2: Range<Int> = 1..<3
let range2 = 1..<3    // 简写

// 3.单侧区间
let range3: PartialRangeThrough<Int> = ...3
let range3 = ...3    // 简写
// 判断区间内是否包含某个值
range3.contains(8)    // fasle
range3.contains(-2)    // true


// 除了Int类型的区间,字符、字符串也能使用区间运算符,但默认不能用在 for-in 中
let strRange: CloseRange<String> = "dd"..."ff"
let strRange = "dd"..."ff"    // 简写
// 判断区间内是否包含某个值
strRange.contains("cb")    // fasle
strRange.contains("df")    // true

// 128个ASCII字符:"\0"..."~"
let charRange: ClosedRange<Character> = "a"..."z"
charRange.contains("g") // true

switch 语句

  • 注意事项:
    1)case、default 后面不能写大括号{}
    2)默认可以不写break,并不会贯穿到后面的条件,编译器会帮我们写上
    3)使用 fallthrough 可以实现向下贯穿的效果
    4)swift 比较安全严谨,在 switch 中必须要处理完所有的逻辑情况(即一般情况 default 不能省略;如果能保证已处理所有情况,也可以省略 default)
    5)case、default 后面至少要有一条语句。如果没有,可以写 break。
var number = 1
switch number {
case 1:
    print("number is 1")
    break // break 可以省略不写
case 2:
    print("number is 2")
    break // break 可以省略不写
default:
    print("number is other")
    break // break 可以省略不写
} 
// 打印结果:
// number is 1
  • 简写版本
var number = 1
switch number {
case 1:
    print("number is 1")
    fallthrough // 因为默认有break,不会向下贯穿;加上 fallthrough 可以实现向下贯穿的效果
case 2:
    print("number is 2")
default:
    print("number is other")
} 
// 打印结果:
// number is 1
// number is 2
  • case 已包含所有情况时,可以省略 default
// 定义枚举类型
enum Sex { case male, female }
let sex = Sex.male
switch sex {
case .male:  // Sex.male 的简写(因为已确定 sex 是 Sex 类型)
    print("男性")
case .female: // Sex.female 的简写
    print("女性")
/*
//  由于上面已包含所有情况,所以可以省略 default
default:
    break
*/
}
  • 复合条件(即是向下贯穿执行多个条件):
    switch 支持字符、字符串类型
// 1.switch 支持 String 类型
let string = "Jack"
switch string {
case "Jack":
    fallthrough // 向下贯穿
case "Rose":
    print("Right person")
default:
    break
} // Right person

// 复合条件合并写法
switch string {
case "Jack", "Rose":
    print("Right person")
default:
    break
} // Right person


// 2.switch 支持 Character 类型
let char: Character = "a"
switch char {
case "a", "A":
    print("The letter A")
default:
    print("Not the letter A")
} // The letetr A
  • switch 区间匹配
let count = 62
switch count {
case 0:
    print("none")
case 1..<5:
    print("a few")
case 5..<12:
    print("serveral")
case 12..<100:
    print("dozens of")
case 100..<1000:
    print("hundreds of")
default:
    print("many")
} // dozens of
  • switch 元组匹配
// 判断某个点是否在正方形内部
let point = (1, 1)
switch point {
case (0, 0):
    print("原点")
case (_, 0): // 可以使用下划线_忽略某个值
    print("在X轴上")
case (0, _):
    print("在y轴上")
case (-2...2, -2...2):
    print("在正方形盒子内部")
default:
    print("在正方形盒子外部")
} // 在正方形盒子内部


// 值绑定
let point = (2, 0)
switch point {
case (let x, 0):
    print("点(\(x), 0)在x轴上")
case (0, let y):
    print("点(0, \(y))在y轴上")
case let (x, y):
    print("(x, y) = (\(x), \(y))")
} // 点(2, 0)在x轴上
  • 关于 switch 中 case 匹配的问题,属于模式匹配的范畴。

where 条件

// 1.在 case 后面使用 where
let point = (1, -1)
switch point {
case let(x, y) where x == y:
    print("on the line x == y")
case let(x, y) where x == -y:
    print("on the line x == -y")
case let(x, y):
    print("(\(x), \(y)) is just some arbitrary point")
} // on the line x == -y


// 2.在 for循环 后面使用 where
var numbers = [10, 20, -10, -20, 30, -30]
for num in numbers where num > 0 { // 使用 where 来过滤 num,只遍历大于零的正数
    print(num);
} // 10 20 30

// 注意:
// 满足后面的 where 条件时就执行大括号里的内容
// 不满足时并不会终止循环,会自动进入下一次循环
// where  的作用相当于 continue,而不是break

标签语句

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