swift之流程控制(Control Flow)

循环控制

  • for-in循环

    • 循环遍历一个序列(sequence):一个范围的数字,数组,字符串,集合,字典等等。
    
      for i in 0...3 {
          print(i)
      }
      for name in ["Tom","Ben","Mary"] {
          print(name)
      }
    
      for ch in "Hello, word!" {
          print(ch)
      }
    
      for (animal,numberOfLegs) in ["Spider": 8, "Ant": 6, "Cat": 4] {
          print("\(animal) has \(numberOfLegs) legs!")
      }
    
      for dic in ["Spider": 8, "Ant": 6, "Cat": 4] {
          print("\(dic.key) has \(dic.value) legs!")
      }
    
    
    • for-in 分段区间
    
      for tickMark in stride(from: 0, to: 10, by: 2) {
          print(tickMark)
      }
      for tickMark in stride(from: 0, through: 10, by: 2) {
          print(tickMark)
      }
    
    
  • while

  • repeat-while

switch

  • switch会将一个值与多个可能的模式匹配,然后基于一个成功匹配的模式指向合适的代码。

  • switch语句一定是全面的,即每一个值都必须有对应的case相匹配,也可以定义一个默认匹配所有情况的case来匹配未明确出来的值,用default标记,必须放在所有case的最后。

  • 不会默认贯穿,会在匹配到第一个case执行完毕之后退出;但是如果希望贯穿,可以使用fallthrough关键字。一个case需要匹配多个值的时候,用逗号隔开。

  • switch用于区间匹配

      let approximateCount = 62
      let countedThings = "moons orbiting Saturn"
      let naturalCount: String
      switch approximateCount {
      case 0:
          naturalCount = "no"
      case 1..<5:
          naturalCount = "a few"
      case 5..<12:
          naturalCount = "several"
      case 12..<100:
          naturalCount = "dozens of"
      case 100..<1000:
          naturalCount = "hundreds of"
      default:
          naturalCount = "many"
      }
      print("There are \(naturalCount) \(countedThings).")
    
  • 元组匹配: (_)可以匹配所有可能值

      let point = (1,1)
      switch point {
      case (0,0):
          print("\(point) is at the origin")
      case (_,0):
          print("\(point) is on the x-axis")
      case (0,_):
          print("\(point) is on the y-axis")
      case (-2...2,-2...2):
          print("\(point) is inside the box")
      default:
          print("\(point) is outside of the box")
      }
    
  • 值绑定:switchcase可以将匹配到的值临时绑定为一个常量或者变量,来给case函数体调用。这个变量或者常量的作用域也仅为case的函数体。

      let point = (2,0)
      switch point {
      case (let x,0):
          print("on the x-axis with a x value of \(x)")
      case (0,let y):
          print("on the y-axis with a y value of \(y)")
      case (let x,let y):
          print("somewhere else at (\(x), \(y))")
      }
    
  • 使用where子句检查是否符合特定的约束。

      let point = (1,-1)
      switch point {
      case let (x, y) where x == y:
          print("(\(x), \(y)) is on the line y = x")
      case let (x, y) where x == -y:
          print("(\(x), \(y)) is on the line y = -x")
      case let (x, y) :
          print("(\(x), \(y)) is just some arbitrary point")
      }
    
    
  • 复合匹配

    • 多个模式之间逗号分隔;模式太长,可以写成多行。

      let someCharacter: Character = "e"
      switch someCharacter {
      case "a", "e", "i", "o", "u":
          print("\(someCharacter) is a vowel")
      case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
          "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
          print("\(someCharacter) is a consonant")
      default:
          print("\(someCharacter) is not a vowel or a consonant")
      }
      
      
    • 复合匹配也可以包括值绑定

      let point = (9,0)
      switch point {
      case (let distance, 0), (0, let distance):
          print("On an axis, \(distance) from the origin")
      default:
          print("Not on an axis")
      }
      
      

控制转移

  • continue
  • break
  • fallthrough
  • return
  • throw
  • 语句标签

guard

A guard statement is used to transfer program control out of a scope if one or more conditions aren’t met.
  • 建议使用guard的情况:
    • 验证入口条件。
    • 在成功的路径上提前退出(黄金大道理论)。
    • guard let语句用于可选值解包
    • 执行被终止,计算结果为空,执行时出现错误
    • 日志(返回之前输出信息到控制台),崩溃和断言中的条件需要处理可选值时。
  • 不要用guard代替琐碎的if...else语句
  • 不要用guard作为if的相反情况
  • 不要在guardelse语句中放入复杂代码。
// 使用 if
 func isIpAddress(ipString: String) -> (Int,String) {
    let components = ipString.split(separator: ".")
    if components.count == 4 {
        if let first = Int(components[0]), first >= 0 && first <= 255 {
            if let second = Int(components[2]), second >= 0 && second <= 255 {
                if let third = Int(components[2]), third >= 0 && third <= 255 {
                    if let forth = Int(components[4]), forth >= 0 && forth <= 255 {
                        // Important code goes here
                        return (0, "ip地址合法")
                    } else {
                        return (4,"ip地址第四部分错误")
                    }
                } else {
                    return (3,"ip地址第三部分错误")
                }
            } else {
                return (2,"ip地址第二部分错误")
            }
        } else {
            return (1,"ip地址第一部分错误")
        }
    } else {
        return (100,"ip地址必须有四部分")
    }
 }
 // 使用 guard
 func isIpAddress(ipString: String) -> (Int,String) {
    let components = ipString.split(separator: ".")
    guard components.count == 4 else {
        return (100,"ip地址必须有四部分")
    }
    guard let first = Int(components[0]), first >= 0 && first <= 255 else {
        return (1,"ip地址第一部分错误")
    }
    guard let second = Int(components[2]), second >= 0 && second <= 255 else {
        return (2,"ip地址第二部分错误")
    }
    guard let third = Int(components[2]), third >= 0 && third <= 255 else {
        return (3,"ip地址第三部分错误")
    }
    guard let forth = Int(components[4]), forth >= 0 && forth <= 255 else {
        return (4,"ip地址第四部分错误")
    }
    // Important code goes here
    return (0, "ip地址合法")
 }

检查API的可用性

  • swift拥有内置的对API可用想的检查功能。
  • 使用if或者guard语句。

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

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,707评论 2 9
  • 控制流 Swift提供了各种控制流程语句。这些包括while循环多次执行任务; if,guard以及switch基...
    Fuuqiu阅读 362评论 0 0
  • 基础部分(The Basics) 当推断浮点数的类型时,Swift 总是会选择Double而不是Float。 结合...
    gamper阅读 1,243评论 0 7
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,821评论 0 6
  • 时间过的真快,转瞬间90天的践行就结束了。 还记得初入G156期的场景吗? 爱学习的人,身上总是满满的正能量,很开...
    Peggy1204baby阅读 253评论 0 1