Swift基础篇——控制流

  • 顺序结构
  • 循环结构
  • 选择结构

一、循环结构

  • for-in
    遍历区间、字符串、数组、字典
  • for
for i in -100...100
{
    i*i
}
//理论上这两个循环是同样的效果,但是在swift 3.0中,推荐使用for-in循环,因为i++已经被废弃,下面的写法会报两个错误:1、++ 和 --将要在Swift3中废弃;可以使用 += 1替代;2、C语言风格的声明将在Swift的未来版本废弃和移除。
for var i = -100 ; i <= 100 ; i ++
{
    i*i
}
  • while
  • do-while
//二分查找法
var arr:[Int] = []

for i in 0..<100{
    arr.append(Int(arc4random()%1000))
}

arr.sorted(by: <)//把数组从小到大进行排序
arr

var min_num = 0 , max_num = arr.count

var mid_num:Int
var target = Int(arc4random()%1000)

while min_num < max_num {
 
    mid_num = ( min_num + max_num) / 2
    arr[mid_num]
    
    if arr[mid_num] == target {
        print("\(target) is foud index \(mid_num)")
        break
    }
    else if arr[mid_num] > target{
        max_num = mid_num - 1
    }
    else{
        min_num = mid_num + 1
    }
}

if min_num >= max_num {
    print("cannot find \(target) in arr")
}

二、选择结构

  • if 语句
let  imTrueVar = true

let imFalseVar = false

if imTrueVar {

print("I'm true!")

}
else if 3 + 4 == 7{

print("3+4==7!")

}
else{

print("I'm false!")

}

『注意』 一般的语言中都会将非零的值定义成真,但是Swift却非如此,例如:

var  aa:Int = 1

//下面的写法编译器会报错,‘Int’这个整形是不能作为一个逻辑的值来进行这种选择的判断的(error: 'Int' is not convertible to 'Bool'),这也说明Swift是一个类型安全型语言,它要求开发者如果想做选择那就要明确的指明一个逻辑的值,即布尔值或者表达式

if aa{

print("I'm true!")

}
//正确的写法

if aa == 1{

print("I'm true!")

}
  • switch 语句
  • case值可以是Float、Bool、String、Int、元组等
  • 不用显示的写break,在满足一个case的情况下,自动就会break,如果想连续执行,即满足一个case之后还会试图进行下一个case的判断,则使用关键字fallthrough
  • case值和default必须包含所判断的变量的所有情况,只要case能涵盖所判断变量的所有情况,可以不需要使用default
  • 不仅可以对整形变量具体的值进行判断,也可以对整形的范围进行判断
//switch语句,不需要显示的写break
var rating:Character = "A"

switch rating {
case "A","a":
    print("Great!")
case "B":
    print("Just so-so!")
default:
    print("It's Bad.")
}
//switch 语句的一些高级用法
//不仅可以对整形变量具体的值进行判断,也可以对整形的范围进行判断
var score = 90
switch score {
case 0:
    print("a")
case 1..<60:
    print("b")
case 60:
    print("c")
case 61..<70:
    print("d")
case 70..<80:
    print("e")
case 100:
    print("f")
default:
    print("g")
}

//可以对元组数据类型进行判断
var coordinate = (1,1)
switch coordinate {
case (0,0):
    print("a")
case (-2...2,0):
    print("b")
case (let x,0):
    print("c")
case (-1,let y):
    print("c")
case (_,1):
    print("d")
case (0,_):
    print("e")
case let (x,y) where x == y:
    print("f")
case (_,let y) where y > 1 :
    print("h")
default:
    print("g")
}

//swift的switch语句不用显示的写braak,在满足一个case的情况下,自动就会break,如果想连续执行,即满足一个case之后还会试图进行下一个case的判断,则使用关键字fallthrough
coordinate = (0,0)
switch coordinate{
case (0,0):
    print("原点")
    fallthrough
case(_,0):
    print("x 轴")
case(0,_):
    print("y 轴")
case(-2...2,-2...2):
    print("区间内")
default:
    print("都不满足")
}

三、控制转移

  • fallthrough
    使得switch语句在做一个判断的时候,当变量的值落入了一个case后还有机会落入下一个case

「使用限制」需要使用fallthrough的case,其下一个case不能声明为变量

例如:

//这样是不被允许的
var coor = (1,1)
switch coor {
case (0,0):
  print("a")
  fallthrough
case (let x,0):
  print("c")
case (-2...2,0):
  print("b")
  fallthrough
default:
  print("d")
}
  • break
    • 立即跳出当前的循环体,即结束循环;
    • 不仅仅可以使用于循环结构,也可以用于switch语句,在switch语句中break的用途是结束switch判断
    • 在swift中的switch语句中不要求显示写break,但是需要涵盖所有的判断情况,且case后必须有执行语句,所以如果在某些case中什么操作也没有,这时候就可以使用break
  • continue
    跳过之后的操作,继续当前的循环体,即结束本次循环,进入下一次循环

break和continue都只是对当前的循环体起作用,但是swift语言提供了另外一种机制,可以使得break和continue这两个控制转移语句对任意一层循环体进行作用。

例如:

var board = Array< Array<Int> >()
for i in 0..<10
{
    board.append( Array(repeating:0,count:10))
}

let randx = Int(arc4random()%10)
let randy = Int(arc4random()%10)
board[randx][randy] = 1

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

推荐阅读更多精彩内容