Swift3.0 - 流控制

Swift3.0 - 真的很簡單
Swift3.0 - 數(shù)據(jù)類型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對象和類
Swift3.0 - 屬性
Swift3.0 - 函數(shù)和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協(xié)議protocol
Swift3.0 - 類和結(jié)構(gòu)體的區(qū)別
Swift3.0 - 枚舉
Swift3.0 - 擴展
Swift3.0 - 下標(biāo)
Swift3.0 - 泛型
Swift3.0 - 異常錯誤
Swift3.0 - 斷言
Swift3.0 - 自動引用計數(shù)(strong,weak,unowned)
Swift3.0 - 檢測API
Swift3.0 - 對象的標(biāo)識
Swift3.0 - 注釋
Swift3.0 - 元類型
Swift3.0 - 空間命名
Swift3.0 - 對象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類簇
Swift3.0 - 動態(tài)調(diào)用對象(實例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑

介紹

  • if...else
if true{
 // code
 }else{
// code
 }

let  (x,y) = (1,2)
if x = y{  // 這是一個錯誤的用法
}

提示:

判斷的條件必須為 true 或者false 不能是1,2 或者存在的對象,不然系會編譯錯誤,這點和OC 是有區(qū)別的

  • 三目運算符(?)
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
  • ?? 的使用

先看下面的例子

let a:Int! = 3
let b = 4
 // 如果a不為nil則對a進行解包,賦值將b的值付給c
let c = a != nil ? a! : b

我們使用?? 可以很方便實現(xiàn)上面的功能

 let c = a ?? b // 如果a為nil則使用b的值替換a的值,如果a不為nil,則對a解包然后將值付給b

我們再看一個例子

let a:Int??? = 3
let b = 4
let c = a ?? b
print(a)
print(c)

運行結(jié)果:

Optional(Optional(Optional(3)))
Optional(Optional(3))

分析:

對a進行一次解包,得到的值不為nil,所以把解包后的值付給c

我們再看一個例子

let a:Int??? = nil
let b = 4
let c = a ?? b
print(a)
print(c)

可能有些人已經(jīng)猜到答案了

nil
4

但我告訴你答案不是這樣的,先來分析一下

首先a,有三個包Optional(Optional(Optional(nil))),當(dāng)我們解掉第一次包后,發(fā)現(xiàn)值為nil,此時,我們需要將b的值替換給a,Optional(Optional(4))

所以我們的最終顯示結(jié)果為:

nil
Optional(Optional(4))

  • 范圍操作符 ... ..<
for index in 1..<5 {
    print("\\(index) times 5 is \\(index * 5)")
 }
  • 多種邏輯操作符的結(jié)合
 if enteredDoorCode && passedRetinaScan || hasDoorKey ||     knowsOverridePassword {
  print("Welcome!")
} else {
  print("ACCESS DENIED")
}
  • for ... in
   // 遍歷數(shù)組
   let names = ["Anna", "Alex", "Brian", "Jack"]
   for name in names {
       print("Hello, \\(name)!")
    }
  // 遍歷字典
   let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
  for (animalName, legCount) in numberOfLegs {
       print("\\(animalName)s have \\(legCount) legs")
   }
  • while
var i = 100 
while i >0{
   i-= 1
}
  • repeat ... while
var i = 10
repeat {
    i -= 1
    print(i)
}while i >= 0
  • switch

需求1: 根據(jù)輸入的成績判斷學(xué)生是否及格
a. 間隔法

enum TestResult{
    case Pass
    case NoPass
}

b. 條件判斷法

 func inputStudentScore(score:Float) -> TestResult{
    switch score {
    case 0..<59:
        return .NoPass
    default:
        return .Pass
    }
}

需求二: 輸入一個頂點 判斷是否在X軸上,或者Y軸上,或者既不在x軸,也不再Y軸上

c.元組法

func inputPoint(point : (Float,Float)) {
    switch point {
    case (_,0):
        print("在x軸上")
    case (0,_):
        print("在y軸上")
    case (_,_):
        print("既不在x軸,也不在y軸上")
    }
}

d.值綁定法

func inputPoint(point : (Float,Float)) {
switch point {
case (let x ,0):
    print("在x軸上\\(x)")
case (0,let y):
    print("在y軸上\\(y)")
case let (x,y):
    print("既不在x軸,也不在y軸上\\(x),\\(y)")
} 
}

需求: 判斷頂點是否在X,Y軸上

  • 混合法
func inputPoint(point : (Float,Float)) {
 switch point {
 case (let x ,0),(0,let x):  // 注意必須每種模式類型相同
 print("在x軸或者y軸上\\(x)")
 case let (x,y):
      print("既不在x軸,也不在y軸上\\(x),\\(y)")
  }
}
  • 控制轉(zhuǎn)移聲明

a.continue

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput.characters {
    switch character {
    case "a", "e", "i", "o", "u", " ":
        continue
    default:
        puzzleOutput.append(character)
    }
}

b.break

let numberSymbol: Character = "三"  // Chinese symbol for the number 3
var possibleIntegerValue: Int?
switch numberSymbol {
case "1", "?", "一", "?":
    possibleIntegerValue = 1
case "2", "?", "二", "?":
    possibleIntegerValue = 2
case "3", "?", "三", "?":
    possibleIntegerValue = 3
case "4", "?", "四", "?":
    possibleIntegerValue = 4
default:
    break
}

c.fallthrough

  let integerToDescribe = 5
var description = "The number \\(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " a prime number, and also"
    fallthrough // 打穿繼續(xù)向下執(zhí)行  
default:
    description += " an integer."
}
print(description)

運行結(jié)果:

The number 5 is a prime number, and also an integer.

d.return

需求:在一個數(shù)組中查找是否存在一個整數(shù),如果找到返回true 沒有返回false

let nums = [1,2,3,6,7,9,10]
func findNum(num:Int)-> Bool{
    for number in nums{
        if num == number{
            return true
        }
    }
    return false
}

e.throw
f.標(biāo)簽用法

需求: 讓一個a數(shù)字從0開始,每次增加一個隨機數(shù),直到數(shù)字a=1000 結(jié)束循環(huán),如果大于1000 則繼續(xù)從0 開始循環(huán)增加

var start:Int = 0
var final = 1000
whileLabel: while start != final {
    start += Int(arc4random_uniform(100)) // 隨機增加一個數(shù)字
    switch start {
    case final:  // 如果== 最終值結(jié)束循環(huán)
        break whileLabel
    case let x where x > final: //如果值大于1000 則初始化為0 繼續(xù)開始循環(huán)
        start = 0
        continue whileLabel
    default:
        break
    =  }
  print(start)
}
  • guard ...else

需求: 輸入學(xué)生姓名,查詢學(xué)生成績

a.原始寫法(if):

let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{ // 先檢測姓名是否為空
    if let n = name {
        if let score = studentScoreDic[n] {// 檢測學(xué)生是否存在
            return score
        }
    }
 return 0.0
}

b.guard ... else

let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{
    // 檢測姓名是否為空
    guard let n = name else {
        return 0.0
    }
    // 檢測學(xué)生是否存在
     guard let score = studentScoreDic[n] else{
        return 0.0
      }
   return score
  }

c.使用?? 簡化寫法

let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{
guard let n = name else {
      return 0.0
}
  return studentScoreDic[n] ?? 0.0
}

d. 多條件簡化法- guard 版

let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{
  guard let n = name ,let score = studentScoreDic[n] else {
      return 0.0
}
  return score
}

e.多條件簡化法- if 版

let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{
    if let n = name ,let score = studentScoreDic[n]{
        return score
    }
    return 0.0
}

中級

  • 多條件判斷

需求:

輸入兩個數(shù)字,如果兩個數(shù)字都小于100 并且第一個數(shù)字小于第二數(shù)字,按照順序輸出他們

方式1:

func inputFirstNum(num1:String,num2:String){
    if let n1 = Int(num1){
        if let n2 = Int(num2){
            if n1 < n2 && n2 < 100 {
                print("\\(n1)<\\(n2)<\\(100)")
            }
        }
    }
}

方式2:

func inputFirstNum(num1:String,num2:String){
    if let n1 = Int(num1),let n2 = Int(num2),n1 < n2,n2 < 100{
        print("\\(n1)<\\(n2)<\\(100)")
    }  
}
  • 元組判斷
if (1, "zebra") < (2, "apple") { // 先判斷第一個,在判斷第二個
 // 結(jié)果為true
} 

你必須注意的幾點

1.轉(zhuǎn)換出現(xiàn)可選值

if let n = Int(3.3){
} // 編譯報錯

if let n = Int("3.3"){
    print(n)
} // 編譯通過

運行結(jié)果:

1.第一個if報錯
2.第二個print(n) 不執(zhí)行

問題:為什么第一個if會報錯乞娄?
答:Swift編譯器要求我們右邊必須為可選值類型Int(3.3) 產(chǎn)生的結(jié)果不是可選值,我在swift3.0-數(shù)據(jù)類型 中講過數(shù)據(jù)類型之間轉(zhuǎn)換不可能出現(xiàn)可選值,但是字符串轉(zhuǎn)數(shù)字結(jié)果為可選值,所以第二個if是正確的

我們修改上面的代碼

if let n:Int  = Int(3.3) {
print(n)
} // 編譯警告

if let n :Int = Int("3.3"){
    print(n)
} // 編譯通過

if let n:Int?  = Int(3.3) {
    print(n)
} // 編譯警告-說總是成功的

if let n :Int? = Int("3.3"){
    print(n)
} // 編譯通過 - 說總是成功的

if let n:Int! = Int(3.3){
    print(n)
}// 編譯報錯 - 非可選值不能解包


if let n :Int! = Int("3.3"){
    print(n)
} // 編譯報錯-解包的時機不對

2.注意可選值的判斷邏輯

let name1:String! = "酷走天涯" // 定義一個需要解封的可選值
let name2:String? = "酷走天涯" // 定義可選值
let name3:String = "酷走天涯"  // 定義非可選值

if name1 != nil {
} // 編譯成功
if let myName = name1{
} // 編譯錯誤

if name2 != nil {
} // 編譯成功
if let myName = name2{
} // 編譯錯誤

if name3 != nil {
} // 編譯警告 - 總是成功
if let myName = name3{
} // 編譯錯誤 - name3 不是可選值

結(jié)論:

只有可選值或者解包過的可選值,判斷是否為nil是有意義的,非可選值不可能為nil,判斷總是成功的,判斷沒有意義沦辙。 對非可選值使用解包判斷方式總是失敗的钮惠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘹黔,一起剝皮案震驚了整個濱河市淤毛,隨后出現(xiàn)的幾起案子欣鳖,更是在濱河造成了極大的恐慌散庶,老刑警劉巖采呐,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件若锁,死亡現(xiàn)場離奇詭異,居然都是意外死亡斧吐,警方通過查閱死者的電腦和手機又固,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煤率,“玉大人仰冠,你說我怎么就攤上這事〉矗” “怎么了洋只?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我识虚,道長肢扯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任舷礼,我火速辦了婚禮鹃彻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妻献。我一直安慰自己,他們只是感情好团赁,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布育拨。 她就那樣靜靜地躺著,像睡著了一般欢摄。 火紅的嫁衣襯著肌膚如雪熬丧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天怀挠,我揣著相機與錄音析蝴,去河邊找鬼。 笑死绿淋,一個胖子當(dāng)著我的面吹牛闷畸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吞滞,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼佑菩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裁赠?” 一聲冷哼從身側(cè)響起殿漠,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佩捞,沒想到半個月后绞幌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡一忱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年莲蜘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掀潮。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡菇夸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仪吧,到底是詐尸還是另有隱情庄新,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站择诈,受9級特大地震影響械蹋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜羞芍,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一哗戈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荷科,春花似錦唯咬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刻获,卻和暖如春蜀涨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝎毡。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工厚柳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沐兵。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓别垮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痒筒。 傳聞我的和親對象是個殘疾皇子宰闰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容