swift控制流(if-else, where,for-in, switch等)

流程控制是我們程序員中必不可少的,各種判斷什么的都需要,我們的程序,基本每一個模塊度需要流程控制

if else判斷語句

swiftif-elseOC的稍微有點區別的,和OC不一樣的是,if 后邊的條件表達式不用寫(),但是后面的大括號不能省略
例如:

var age : Int = 4;
if age >= 22 {
    print("get married")
} else if age >= 18 {
    print("being a adult")
} else if age >= 7 {
    print("go to school")
} else {
    print("just a child")
}

where循環語句

var num = 5
while num > 0 {
    print("num is \(num)")
    num -= 1
}

//打印結果分別是5、4、3、2、1

除了while 還有 repeat ... whilerepeat {} while類似于C語言的 do ... while,

whilerepeat ... while的區別:
repeat ... while最少會執行一次,while的條件表達式是在循環結束時執行;
正常的while是在一開始就檢查條件表達式。

var num2 = -1
repeat {
    print("num is \(num2)")
} while num2 > 0

for-in 循環語句

我們先初始化一個數組,我們接下來for-in循環的數據都來自這個數組

let names = ["xiaoMing", "xiaoHong", "xiaoWang", "xiaoZhang"]
正常的遍歷循環
for name in names {
    print("name is \(name)")
}
//打印結果:
//xiaoMing
//xiaoHong
//xiaoWang
//xiaoZhang
for循環閉區間運算符

其中閉區間書寫方法a...b,含義是a<= 取值 <=b

for i in 0...3 {
    print("name is \(names[i])")
}
//打印結果
//xiaoMing
//xiaoHong
//xiaoWang
//xiaoZhang

當然這里的閉區間也可以單獨聲明,或者是傳值,例如

let range = 1...3
for i in range {
    print("name is \(names[i])")
}
//打印結果
//xiaoHong
//xiaoWang
//xiaoZhang

使用閉區間運算符,但是我們循環過程中不使用i值,可以將i的部分寫成_,swift里面_是的簡寫語法,我理解的含義是忽略這個值,但我通常不推薦這么寫

for _ in 1...3 {
    print("今天又是美好的一天")//將會打印三次`今天又是美好的一天`
}
for循環半開區間運算符

其中半開區間書寫方法a..<b,含義是 a<= 取值 < b
使用方法如下

for i in 0..<3 {
    print("name is \(names[i])")
}
//打印結果
//xiaoMing
//xiaoHong
//xiaoWang

使用半開區間運算符實現OC語言中for循環的樣式

for i in 0..<names.count {
    print("name is \(names[i])")
}

無論是閉區間運算符還是半開區間運算符,條件那里都都可以聲明稱常量(let)

那么怎么實現在OCfor in的效果呢?
還是以上邊的names數組為例
使用閉區間

for name in names[0...3] {
    print("name is \(name)")
}

不使用閉區間,實現OC樣式,其實就是省略了聲明

for name in names {
    print("name is \(name)")
}
for循環單側區間

單側區間會讓循環的條件朝一個方向盡可能的遠
例如開始為1,一直取到names最后一個值,

for name in names[1...] {
    print("name is \(name)")
}
//打印結果如下
//name is xiaoHong
//name is xiaoWang
//name is xiaoZhang

例如開始為names最小值,一直取到2位置的值

for name in names[...2] {
    print("name is \(name)")
}
//取值位置為`0.1.2`,打印結果如下
//name is xiaoMing
//name is xiaoHong
//name is xiaoWang

同樣單側區間運算也可以加條件

for name in names[..<2] {
    print("name is \(name)")
}

區間類型

剛才寫到了單側區間,該區間的類型是PartialRangeThrough

let range = ...100//含義是無限小至100
print(range.contains(50))   //true
print(range.contains(103))  //false
print(range.contains(-1000))//true
區間的類型
//閉區間,下面的含義是 <=1 && >=3
let range1: ClosedRange<Int> = 1...3
//半開區間,下面的含義是 <=1 && <3
let range2: Range<Int> = 1..<3
//單側區間,下面的含義是 <=10
let range3: PartialRangeThrough<Int> = ...10

當然字符和字符串也能使用區間運算符,但是默認這樣的區間運算符不能使用在for-in
以字符串舉個例子

//字符串
let stringRange = "a"..."g"
print(stringRange.contains("d"))//true
print(stringRange.contains("m"))//false

//字符,如果用字符需要單獨聲明
let characterRange = "\0"..."~"
print(characterRange.contains("G"))//true
print(characterRange.contains("9"))//true
`let characterRange = "\0"..."~"等同于let characterRange:ClosedRange<Character> = "\0"..."~"`
帶間隔的區間值

比如,在一個循環中,從3開始,每次累加2,所有結果<15,一般用在for循環里面

let number = 15
let numberInterval = 2
for num in stride(from: 3, to: number, by: numberInterval) {
    print(num)
}
//打印結果
//3
//5
//7
//9
//11
//13

switch

OC的大同小異,幾個注意的點
1.casedefault后面不能有大括號{}
2.每個casedefault后面最少要有一條語句,如果沒有自己要寫的語句,可以寫break
3.casedefault后面如果有代碼語句,則可以省略break,不會產生貫穿到下面的情況
4.如果要實現貫穿效果,那么在當前case結束時添加fallthrough關鍵字
5.switchcase需要保證能處理所有的情況,有兩種選擇方法,
第一個是在不想處理的地方加break,第二個是寫上default
下面舉個例子:

var number = 3
switch number {
case 3:
    print("number is 3")
    fallthrough
case 4:
    print("number is 4")
    break
case 5:
    print("number is 5")
    break
default:
    print("number is other")
    break
}
//打印結果:
//number is 3
//number is 4

當然也可以在case后面跟上多復合條件,以下面這個例子就是,當number567都會進入case 5,6,7比如:

let number = 5
switch number {
case 5,6,7:
    print("number 5,6,7")
case 8:
    print("number 8")
default:
    print("number is other")
}
//打印結果
//number 5,6,7
switch區間匹配

使用區間進行匹配case

let number = 55
switch number {
case 0:
    print("number = 0")
case 1..<10:
    print("1<= number < 10")
case 10...30:
    print("10<= number <= 30")
case 31..<80:
    print("31 <= number < 80")
case 80...100:
    print("80 <= number <= 100")
default:
    print("number is other")
}
//打印結果
///31 <= number < 80
switch元組匹配
let point = (1, 1)
switch point {
case (0, 0):
    print("point (0, 0)")
case (_, 0):
    print("point (_, 0)")
case (0, _):
    print("point (0, _)")
case (-2...2, -2...2):
    print("ponit inside the box")
default:
    print("point other")
}
//打印結果:
//ponit inside the box
值綁定

只要有一個值符合case,那么case上另一個值默認被條件值綁定

let point = (3, 5)
switch point {
case (let x, 4):
    print("x point \(x)")
case (4, var y):
    print("y point \(y)")
case let (x, y):
    print("point \(x),\(y)")
}
//打印結果:
//point 3,5

值綁定外加條件語句where

let point = (1, 1)
switch point {
case let (x, y) where x == y:
    print("x == y")
case let (x, y) where x > y:
    print("x > y")
case let (x, y) where x < y:
    print("x < y")
case (_, _):
    print(point)
}
//打印結果
//x == y

當然條件語句不一定必須在switch里面,比如可以加在for循環里面,
例如計算所有正整數的和,使用where語句可以省下一個if

let numbers = [28, -22, -56, 0 ,78, 25, 99, -1]
var sum : Int = 0
for number in numbers where number > 0 {
    sum += number
}
//print("sum is \(sum)")
//打印結果
//sum is 230

標簽語句

就是給循環起一個名字,這樣我們就可以在內部嵌套的那個循環控制外邊這個循環;
下述這個就是的邏輯是,當K==3時跳過當前outer的循環,當i==3時跳出outer的循環,也就都跳出去了

outer: for i in 1...4 {
    for k in 1...4 {
        if k == 3 {
            continue outer
        }
        if i == 3 {
            break outer
        }
        print("i == \(i), k == \(k)")
    }
}

輸出的結果應該沒有3也沒有4

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容