swift4.1 系统学习七

简介: import Foundation//swift学习笔记07/*控制流语句学过任何一种语言的小伙伴们都对控制流语句不陌生,几乎每一天都在用。控制流分类:1.分支2.循环*//*do语句块这个语句块在我之前的学习中一直在使用,是一种在学习中很方便的写代码的方式。

import Foundation

//swift学习笔记07

/*
控制流语句
学过任何一种语言的小伙伴们都对控制流语句不陌生,几乎每一天都在用。
控制流分类:
1.分支
2.循环
*/

/*

  1. do语句块
    这个语句块在我之前的学习中一直在使用,是一种在学习中很方便的写代码的方式。
    作用:
    1》作为一个单独的作用域,声明的局部对象外部是无法访问的。

允许嵌套,如果内部的变量名字与外部相同,则会访问内部变量。
*/

do {
    let a = 1, b = 2
    do {
        let a = 10
        let b = 20
        let c = 5
        
        do {
            let a = 30
            let b = 40 + c
            
            print("最里层: a = \(a), b = \(b), c = \(c)")
            //a = 30, b = 45, c = 5
        }
        print("第二层: a = \(a), b = \(b), c = \(c)")
    }
    print("最外层: a = \(a), b = \(b)")
}

swift中如果不用do引出,而是单单用花括号{ },那么它默认表达的是一个闭包表达式,而不是一个语句块。

/*
2.if语句
注意:
1》swift中if语句中的条件表达式的圆括号可以省略
2》swift中if语句中的花括号不能省略,即使只有一条语句
*/

do {
    let a = 0, b = 10
    if a == 0 {
        print("a = 0")
    } else {
        print("a != 0")
    }
    
    if a + b > 10 {
        print("大于10")
    } else if a + b == 10 {
        print("等于10")
    } else {
        print("小于10")
    }
    
    /*
     初学者要注意
     if 表达式 {
     
     } else if 表达式 {
     
     }
     与
     if 表达式 {
     
     }
     if 表达式 {
     
     }
     这两者之间的不同
     */
}

/*

  1. 三目条件操作符
    表达式 ? 语句1 :语句2
    意思是: 如果表达式==true,执行语句1,否则执行语句2
    是对if...else 语句的一种更加简单的表达
    */
do {
    var a = 1, b = 2
    a = a > 0 ? a + b : a - b
    print("a = \(a)")
    
    b = a > b ? a : b
    print("b = \(b)")
  
}

注意: 三目运算符中的 ?一定要与表达式之间有空格,不然会被当做可选类型的?。最好三目运算符表达式之间都要加空格。

/*

  1. switch语句
    条件选择多于等于三条的时候,就要考虑使用switch语句,使得逻辑更加的清晰。
    switch 表达式 {
    case 条件1:
    case 条件2:
    ...
    注意:
    1》swift中,switch后面的表达式可以是void类型。
    2》一般情况下switch语句块中,最后会跟一个default标签,以处理异常情况。但是,
    当switch的case语句已经列举了所有类型之后,default就不需要了,如果加了不必要的default,
    编辑器会报出警告。
    3》swift语言中,switch后面的表达式可以是任何遵循了Equatable协议的类型的表达式,
    甚至还可以是一个元类型。
    但是case后面的表达式必须是表示值类型的表达式。
    4》所有的case语句包括default语句都必须至少包含一条语句。
    5》默认情况下,执行完一个case语句块之后直接跳出switch,而不需要显式添加break语句。
    当我们在某些情况下想跳出当前的case语句的时候,可以使用break语句,跳出整个switch语句块。

switch 常常与 enum 一起使用
}

*/
do {
   enum Type: String {
       case iphone5 = "iphone5"
       case iphone6 = "iphone6"
       case iphone7 = "iphone7"
       case iphone8 = "iphone8"
       case iphoneX = "iphoneX"
   }
   
   var type: Type = .iphoneX
   type = .iphone6
   
   switch type {
   case .iphone5:
       print(type)
   case .iphone6:
       print(type)
   case .iphone7:
       print(type)
   case .iphone8:
       print(type)
   case .iphoneX:
       print(type)
   }
   
}

do {
   
   class Test: CustomStringConvertible {
       var a = 0, b = 100
       init(a: Int, b: Int) {
           self.a = a
           self.b = b
       }
       
       var description: String {
           return "a = \(a), b = \(b)"
       }
       
   }
   
   let t = Test.init(a: 5, b: 10)
   let q = Test.init(a: 6, b: 88)
   
   switch t {
   case let obj:
       print("obj = \(obj)")
       print("value = \(obj.a + t.b)")
   }
   
   switch type(of: t) {
   case let type:
       print("type is :\(type)")
   }
   
   switch type(of: q) {
   case let type:
       print("type is :\(type)")
   }
}

do {
   struct MyObject: Equatable {
       var a = 0
       var b = 1
       
       public static func == (lhs: MyObject, rhs: MyObject) -> Bool {
           return (lhs.a == rhs.a && lhs.b == rhs.b)
       }
   }
   
   let obj = MyObject(a: 3, b: 4)
   let obj2 = MyObject(a: 3, b: 3)
   
   switch obj {
   case MyObject():
       print("dummy object")
   case obj2:
       print("obj2")
   case MyObject(a:3, b:4):
       print("correct object")
   default:
       print("no match")
   }
   
   //打印出:correct object
}

/*

  1. case匹配模式
    swift编程语言中的case匹配非常的丰富,除了上面已经介绍过的匹配方式,还有
    1》复合case匹配,
    2》区间匹配,
    3》值绑定匹配形式
    4》以及where从句引出的谓词逻辑匹配。

*/

//1>复合case匹配
/*
概念:一条case语句可以包含多个表达式,各个表达式之间用逗号分隔,这些表达式之间只要有一个能与
switch表达式匹配上,那就执行该case下的语句。
*/

do {
    var a: Int8 = 10
    switch a {
        //复合case
    case 0, 1, 2:
        print("zero")
       //case后面的表达式亦需要一定是常量和字面量,也可以是变量
    case a + 1, a:
        print("加1")
        a = a + 1
        print("a = \(a)")
    default:
        break
    }
}

// case后面还可以跟一个范围表达式
do{
    let score = 88
    switch score {
    case 0..<60:
        print("不及格")
    case 60..<80:
        print("良好")
    case 80..<99:
        print("优")
    case 100:
        print("完美")
    default:
        break
    }
}

// swift语言中case匹配还有一个强大的功能——值绑定
/*
 一般情况下,我们可以直接在case后面直接跟let或者var声明一个局部对象,以捕获switch后面表达式的值。
 该对象只能在当前的case中可见。不需要default标签。
 */

do {
    let a = 8
    switch a {
    case 0, 1, 2..<5:
        print("正产值")
    case let v:
        print("v = \(v)")
    }
    
    switch a {
    case var v:
        v += 1
        print("v = \(v)")
    case 100:
        print("永远不会执行")
    }
    
    print("a = \(a)")
}

//基于值绑定基础上使用where从句
/*
 where后面直接跟一个bool表达式,表示当该表达式为真的时候则匹配当前的case,
 这么一来,只绑定也无法覆盖所有的case情况了,所以需要default处理。
 */

do {
    let a = 8
    switch a {
    case let v where v > 0 && v < 3:
        print("正常值")
    case let v where v >= 3 && v <= 10:
        print("\(v)在[3,10]之间")
    default:
        print("别的值")
    }
}

// 6. case 匹配模式用于元组对象

do{
    let tuple = (8, 9)
    switch tuple {
    case (0, 0):
        print("0")
    case (1, 2), (3, 4):
        print("one")
    case (5, 6), (7, 8):
        print("two")
    case (_, 8):
        print("哈哈哈哈")
    case (1...3, 5..<10), (_, 4...9):
        print("区间")
    default:
        print("其他值")
    }
}
目录
相关文章
|
Swift iOS开发
Swift:暗黑模式iOS 13以上支持是否跟随系统和iOS13以下的主题适配
Swift:暗黑模式iOS 13以上支持是否跟随系统和iOS13以下的主题适配
1290 0
Swift:暗黑模式iOS 13以上支持是否跟随系统和iOS13以下的主题适配
|
存储
swift4.1 系统学习十四 协议
// 协议 /* OC中也有协议,swift中的协议的作用与OC中基本一样,只是在写法上有一点区别。 我们使用 protocol关键字来定义一个协议。在一个协议中只能存放计算式属性以及方法的声明, 而不能对他们进行定义。
1090 0
|
存储 Swift iOS开发
swift4.1 系统学习十三 结构体(二)
// // main.swift // swift14(结构体) // // Created by iOS on 2018/10/15. // Copyright © 2018年 weiman. All rights reserved. // import Foundation // 结构体(二) /* 继续上节内容,学习结构体的相关知识。
1022 0
|
存储 Swift
swift4.1 系统学习十三 结构体(一)
/* 结构体 大部分语言中都会有结构体。swift中的结构体属于四大基本类型(函数、枚举、结构体、类)之一,他属于值类型。 标准库中的很多类型都是结构体类型,像Int、Float、String、Array。
979 0
|
存储 编译器 Swift
swift4.1 系统学习十二 枚举
/* 枚举 swift的枚举类型也是一个很强大的类型,与其他语言相比,swift中枚举应用更加灵活、广泛。 例如: 像C或者OC中都有枚举类型,但是他们的枚举类型默认为整数类型int兼容。
915 0
|
C++ iOS开发 Swift
swift4.1 系统学习十 函数
swift的函数与其他语言中的函数还是有很多的不同点的, 我们在本节中一起学习swift中的函数都有哪些特性。 辅助文件, 在“统一的函数引用体系”中会用到。
1018 0
|
iOS开发 索引 Swift
swift4.1 系统学习十一 闭包
// // main.swift // swift11(闭包) // // Created by iOS on 2018/10/10. // Copyright © 2018年 weiman. All rights reserved. // import Foundation /* 闭包 闭包是swift中比较重要的一部分内容,也是个人认为比较难以理解的内容,也可能是之前没有 细细的研究的缘故。
1376 0
|
安全 Swift iOS开发
swift4.1 系统学习九 Optional
// // main.swift // swift09 // // Created by iOS on 2018/9/29. // Copyright © 2018年 weiman. All rights reserved. // import Foundation // swift学习笔记9 /* Optional:可选类型 ? 可选类型是swift特色之一,也是很多初学者不适应的原因之一。
983 0
|
Swift 机器学习/深度学习 C语言
swift4.1 系统学习八
// // main.swift // swift08 // // Created by iOS on 2018/9/28. // Copyright © 2018年 weiman. All rights reserved. // import Foundation //swift学习笔记8 /* 1. for-in 循环 swift中使用for-in循环还是很频繁的。
872 0
|
索引 Swift 自然语言处理
swift4.1 系统学习六
swift学习笔记6 字符和字符串 在swift中,String类型也是结构体,属于值类型,而不是引用类型。这一点,与OC是不一样的。 // // main.
821 0