Swift(二 控制语句 集合类型)

第七章 控制语句

1、分支语句(条件语句)

if
  • if
    大括号不能省略。判断句必须有明确的真假(Bool值),不再有非0 nil即真

     var score = 95
     if score > 85 {
         print("Good")
     }
    
  • if-else
    条件满足为true,那么else就跳过。如果为false,忽略if语句,直接执行else语句组。

  • else-if
    多个分支中只执行一个语句组。

guard (只能在函数里面使用)

在Swift2之后新添加的关键字。目的是替换复杂if-else语句的嵌套,提高可读性。guard-else,在条件不满足的情况下执行else语句return\throw,满足的话就跳过else,好处是条件直接是自己想要的,而不是再想出用它的补集做判断guard解析 函数里面跟return 循环里面跟break continue 根据语境选择关键字。

  func guardFun(score: Int){
       guard  score > 85 else{
              print(" not Good")
              return // 方法内使用
       }
     print("Good") // 这是需要执行的代码 
 }
switch
  • switch可以比较整数、浮点数、字符、字符串、元组等类型,既可以是离散的 又可以是连续的。
  • switch后面必须有个default语句,case与default后面不需要显式添加break语句,分支执行完其中一个case或者default语句就会跳出swich语句,不再是遇到break才跳出switch。但是, 在enum枚举中,枚举值如果全部列举出来,default可有可无,最好不加。
  • 当case后面跟着多个离散值的时候,用“ , ”分离开即可,是 ”或“ 的关系。
  • fallthrough case穿透

2、循环语句

while、repeat-while(相当于do-while)、for-in

while条件语句只能写一个Bool类型的表达式。不存在非0即真

while 循环条件{
    满足条件要执行的语句组  // 最少执行0次
}

repeat {
    满足条件要执行的语句组  // 最少执行1次
}while 循环条件
Swift3:for语句只能与in关键字结合使用。对范围和集合进行遍历。不再有 for-i
for v in 1...3 {  // v不用加let var关键字. 如果循环里面用不到v  就换成下划线_  循环更高效。
      print(v*v)
}

let numbers = [1, 2, 3, 4, 5]
for item in numbers {
    print("count is \(item)")
}
// 非要利用索引index 调用enumerated()->(index, element)返回元组实例函数
for (index, element) in numbers.enumerated() {
     print("index:\(index), element:\(element)")
}
 // 这个方法也可以用到索引k
 for k in 0..<numbers.count {
         print("index\(k+1)----value\(numbers[k])")
}

3、跳转语句

break 标签写在循环前面
  label1: for i1 in 1...3 {
       label2: for i2 in (1...2).reversed() {  // reversed()反向遍历区间
            if i2 == i1 {
                 break label1  // 跳出标签为label1的循环
           }
       print("(i1, i2) = (\(i1), \(i2))")
     }
}
#结果:(i1, i2) = (1, 2)
continue

可带标签 也可不带标签。

 label1: for i1 in 1...3 {
       label2: for i2 in (1...2).reversed() {  // reversed()反向遍历区间
            if i2 == i1 {
                 continue label1  // 跳出标签为label1的循环体中尚未执行的语句,接着进行label1的条件判断,决定是否继续循环。
           }
       print("(i1, i2) = (\(i1), \(i2))")
     }
}
#结果:
   (i1, i2) = (1, 2)
   (i1, i2) = (3, 2)
   (i1, i2) = (3, 1)
fallthrough - 贯通之意,用在switch中

如果符合的case最后加了fallthrough,那么这个case之后的case\default代码会继续执行。不再有fallthrough或者碰到default是最后要执行的, 执行完就结束switch分支语句。

4、区间运算符 (两种)

  • 闭区间:1...3 代表: 1 <= 范围 <= 3 (1是下临界值 3是上临界值)
  • 半开区间: 1..<3 代表: 1 <= 范围 < 3 (1是下临界值 3是上临界值)

5、where语句

类似SQL中的where语句。能用在swith\for语句中,进行条件过滤。

  • case (xx1, let age, xx3)where age>20:
    // 要执行的代码... let age是值的绑定

  • // numbers是个数组
    for item in numbers where item > 5 {
    print("Count is: (item)");
    }

第八章 Swift原生集合类型

1、数组

  • Array是结构体类型,是一个一维泛型集合。元素是有序的,可以重复出现。
    声明:

    var studentList: Array<String>
    var studentList1: [String]
    

    初始化:声明的时候,可以初始化 也可以不初始化。但是 let定义的数组为不可变数组 必须声明的时候初始化,以后也不可以修改。

     var student: [String] = ["张三", "李四", "王五"]  // : [String] 去掉更常用
    

    特殊初始化:

      // 进行了初始化 var studentList1: [String]只声明 没有进行初始化,即没有开辟内存空间
      var studentList2 = [String]()   // 常用
      var studentList3 = Array<String>()   // 不常用
    
  • 可变数组的插入元素:

      student.insert("刘备", at: student.count)
      #warning  student.count 是指数组的长度
      student.append("lpn")  // 追加元素
    
  • 删除元素

         student.remove(at: 1)
    
  • 修改元素

         str[0] = "qwe"
    
  • 取出元素

          str[0]
    
  • 遍历数组

    1、for (index, value) in student.enumerated() {
       print("\(index)---\(value)") // index是索引,value是元素
    }
    
    2、for i in 0..<student.count{ ...  }
    
    3、for name in str {  // 直接遍历
            print(name)
         }
    4、for name in str[0...1] {
          print(name)
     }
    
  • 数组的合并: 相同类型的数组才能允许合并

     str + str1
    

2、Set

  • 是由一串无序的,不能重复 的相同类型元素构成的集合。结构体类型,也是一个一维泛型集合。

  • Set声明 let不可变 var可变

    var studentList: Set<String>
    
  • Set初始化

     // 初始化
    var studentList1: Set<String> = ["张三", "李四", "王五", "赵六"]
    var studentList2 = Set<String>()
    // var studentList3 = ["张三", "李四"] 这个默认的是数组
    // var studentList3: [String] = ["张三", "李四"] 这个默认的是数组
    
  • Set操作 无序!!始终操作对象在最左边

    insert(_:) // 插入一个元素  在开始的位置
    removeFirst() // 删除最后一个元素(即是左边第一个元素)
    remove(_:)  // 删除指定的元素
    contains(_:) // 是否包含某个元素  返回Bool
    
  • 遍历与数组遍历一样 for - in ,enumerated()->(index, value)元组

  • Set运算

    let A: Set<String> = ["a", "b", "e", "d"]
    let B: Set<String> = ["d", "c", "e", "f"]
    
    A.intersection(B) // 交集 {"e", "d"}
    A.union(B)  // 并集 {"b", "e", "a", "f", "d", "c"}
    A.symmetricDifference(B) // 异或  属于A但不属于B 属于B但不属于A {"b", "f", "a", "c"}
    A.subtracting(B) // A与B的差集 {"b", "a"}
    A.isSubset(of: B) // A是B的子集吗 返回Bool值 false
    

3、字典---即使类型一直也不能相加+合并,数组可以

  • 同名映射\散列表 结构体类型 也是一个泛型集合

  • 字典的声明:

    var dict1: Dictionary<Int, String>
    var dict2: [Int: String]  // 属于简写
    
  • 初始化:let定义的(不可变)字典的同时 必须进行初始化

    var dict1 =  Dictionary<Int, String>()  // 可变字典先创建 后赋值
    var dict2 = [Int: String]()  // 可变字典常用[Int: AnyObject]() AnyObject指类型,而NSObject指创建对象
    var dict3 = [102 : "123"]  // 类型也可以带上  不可变的字典常用简单
    var dict3: Dictionary<Int, String> = [102 : "123"]
    var dict3: [Int: String] = [102 : "123"]
    
  • 添加

     var dict1 = [String: AnyObject]() // 不同类型
     
     dict1["height"] = 1.88 as AnyObject
     dict1["name"] = "xxx" as AnyObject
     dict1["age"] = 18 as AnyObject
    
  • 删除

      dict1.removeValue(forKey: "name")
    
  • 修改

    dict1["name"] = "123" as AnyObject // 如果name  key不存在那么久add添加,如果存在就update修改  同updateValue
    
    var dict3:[Int: String] = [102 : "123"]
    var replaceStr = dict3.updateValue("456", forKey: 102)
    print(replaceStr!)   // 返回被替换的值打印 ”123“
    
  • 遍历

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

推荐阅读更多精彩内容