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 - 擴(kuò)展
Swift3.0 - 下標(biāo)
Swift3.0 - 泛型
Swift3.0 - 異常錯(cuò)誤
Swift3.0 - 斷言
Swift3.0 - 自動引用計(jì)數(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)用對象(實(shí)例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑

介紹

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

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

提示:

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

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

先看下面的例子

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

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

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

我們再看一個(gè)例子

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

運(yùn)行結(jié)果:

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

分析:

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

我們再看一個(gè)例子

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

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

nil
4

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

首先a,有三個(gè)包Optional(Optional(Optional(nil))),當(dāng)我們解掉第一次包后,發(fā)現(xiàn)值為nil,此時(shí),我們需要將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
    }
}

需求二: 輸入一個(gè)頂點(diǎn) 判斷是否在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)")
} 
}

需求: 判斷頂點(diǎn)是否在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)

運(yùn)行結(jié)果:

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

d.return

需求:在一個(gè)數(shù)組中查找是否存在一個(gè)整數(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)簽用法

需求: 讓一個(gè)a數(shù)字從0開始,每次增加一個(gè)隨機(jī)數(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)) // 隨機(jī)增加一個(gè)數(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
}

中級

  • 多條件判斷

需求:

輸入兩個(gè)數(shù)字,如果兩個(gè)數(shù)字都小于100 并且第一個(gè)數(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") { // 先判斷第一個(gè),在判斷第二個(gè)
 // 結(jié)果為true
} 

你必須注意的幾點(diǎn)

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

if let n = Int(3.3){
} // 編譯報(bào)錯(cuò)

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

運(yùn)行結(jié)果:

1.第一個(gè)if報(bào)錯(cuò)
2.第二個(gè)print(n) 不執(zhí)行

問題:為什么第一個(gè)if會報(bào)錯(cuò)?
答:Swift編譯器要求我們右邊必須為可選值類型Int(3.3) 產(chǎn)生的結(jié)果不是可選值,我在swift3.0-數(shù)據(jù)類型 中講過數(shù)據(jù)類型之間轉(zhuǎn)換不可能出現(xiàn)可選值,但是字符串轉(zhuǎn)數(shù)字結(jié)果為可選值,所以第二個(gè)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)
}// 編譯報(bào)錯(cuò) - 非可選值不能解包


if let n :Int! = Int("3.3"){
    print(n)
} // 編譯報(bào)錯(cuò)-解包的時(shí)機(jī)不對

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

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

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

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

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

結(jié)論:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容