美文网首页
第二课 流程控制、函数、汇编分析

第二课 流程控制、函数、汇编分析

作者: 飘摇的水草 | 来源:发表于2024-03-21 20:50 被阅读0次

    if-else

    let age:Int = 4
    
    if age >= 22{
    
        print ("Get married")
    }else if age >= 18{
        print ("being a adult")
    } else if age >= 7{
        print ("go to school")
    } else {
        print("Just a child")
    }
    
    • if 后面的条件可以活力小括号
    • 条件后面的大括号不可以省略
    • if 后面的条件只能是 Bool 类型,而不可以是整数等类型

    while

    Swift里加了一个 repeat while,相当于C语言中的do while

    var num = -1
    repeat {
       print ("num is \(num)")
    } while num > 0
    
    • 从 Swfit 3开始,去除了自增、自减运算符

    for

    • 闭区间运算符:a...b,a <= 取值 <= b
    let range = 0...3
    let arr = ["lilei","xiaohong", "ceshi", "cdkdk"]
    
    
    for i in range{
        print arr[i]
    }
    
    for i in 0...3 {
        print arr[0]
    }
    
    for name in arr[0...3] {
        print (name)
    }
    

    在以上的代码中,i 默认是常量,如果要修改 i 的值,把它声明为变量即可

    for var i in 0...3 {
        i += 5
        print (i)
    }
    
    • 半开区间运算符:a..< b,a <= 取值 < b
    • 单侧区间:让区间朝一个方向尽可能地远
    for name in names[...3] {
        print name
    }
    
    for name in names[0...] {
        print name
    }
    

    switch

    var number = 1
    
    switch number{
    
        case 1:
          print("number is i")
          break
        default:
          print("other")
    }
    
    • casedefault 后面不能写大括号
    • 默认可以不写 break,并不会贯穿到后面的条件
    • 如果希望继续执行下面的结果,break 改成 fallthrough 即可
    • switch 必须要保证能处理所有的情况
    • casedefault 后面至少要有一条语句
    • 如果不想做任何事,加个 break 即可
    • 另外switch语句还支持复合条件,也支持 CharacterString 类型

    如下所示,这两种写法的结果是一样的

    
    let string = "Jack"
    
    switch string{
    
        case "Jack":
           fallthrough
        case "Rose":
           print ("person")
        default:
           break
    }
    
    switch string{
    
        case "Jack", "Rose":
           print ("person")
        default:
           break
    }
    

    区间匹配、元组匹配

    let count = 62
    
    switch count{
        case 0:
          print ("none")
        case 1..<5:
          print ("a few")
        case 5..<12:
          print ("several")
        default:
          print ("many")
    }
    

    并且支持用下划线_ 来忽略某个值

    以下这段代码为判断某个点在什么地方

    let point = (1, 1)
    
    switch point{
    
        case (0,0):
          print ("the origin")
        case (_, 0):
          print ("x-axis")
        case (0, _):
          print ("y-axis")
        default:
          print("outside")
    }
    

    值绑定

    let point2 = (2, 0)
    
    switch point2{
    
        case (let x, 0):
           print ("on the x-axis with an value of \(x)")
        case (0, let y):
           print ("on the y-axis with a value of \(y)")
        case (let x,let y):
           print ("some where else at \(x) , \(y)")
    }
    

    switch 语句中 where 的用法

    let point3 = (1, -1)
    
    switch point3{
    
        case let (x,y) where x == y:
           print ("on the line x == y")
        case let (x,y) where x == -y:
           print ("on the line x == -y")
        case let (x,y):
           print ("\(x) , \(y) is just ")
    }
    

    将所有正数加起来

    var numbers:Array = [10,30, -12, -56, 23]
    
    var sum = 0
    for num in numbers where num >= 0{
    
        sum += num
    }
    
    print (sum)
    

    标签语句

    outer : for i in 1...4{
    
        for k in 1...4{
    
            if k == 3{
                
                continue outer
            }
    
            if i == 3{
                break outer
            }
    
            print ("i == \(i), k == \(k)")
        }
    }
    

    函数的定义

    func pi() -> Double {
    
        return 3.14
    }
    
    func sum (v1: Int, v2 : Int) -> Int {
    
        return v1 + v2
    }
    
    var v3:Int = sum(v1:10, v2 : 34)
    
    print (v3)
    

    注意:形参默认为 let,也只能是 let

    以下三种无返回值的写法是一样的

    func func1() -> Void{
    
    }
    
    func func2 -> (){
    }
    
    func func3(){
    }
    

    返回元组:实现多返回值

    func calculate (v1: Int , v2: Int) -> (sum:Int, difference: Int, average:Int){
    
        let sum = v1 + v2
        return (sum, v1 - v2, sum >> 1)
    }
    
    let result = calculate(v1:20, v2:80)
    
    result.sum
    result.difference
    result.average
    

    函数的文档注释

    /// 求和【概述】
    ///
    /// 将2个整数相加【更详细的描述】
    ///
    /// - Parameter v1 :第1个整数
    /// - Parameter v2 :第2个整数
    /// - Returns : 2个整数的和
    ///
    /// - Note:传入2个整数即可【批注】
    ///

    func sum3(v1:Int, v2:Int) -> Int{
        return v1 + v2
    }
    

    呈现的效果如下图所示

    image.png

    详细的注释规范请参考:https://swift.org/documentation/api-design-guidelines/

    默认参数值
    func check(name:String = "nobody", age:Int, job:String = "none"){
    
        print ("name = \(name), age = \(age), job = \(job)")
    }
    
    check (name:"Jack", age:14, job:"Doctor")
    check (name:"Jack", age:20)
    check ( age:14, job:"Doctor")
    
    可变参数值
    func  sum4(_ numbers: Int...) -> Int {
    
        var total = 0
    
        for num in numbers{
            total += num
        }
    
        return total
    }
    
    var total = sum4(10,290,34,20)
    print(total)
    
    • 一个函数最多只能有1个可变参数
    • 紧跟在可变参数后面的参数不能省略参数标签
    输入输出参数 (in-out Parameter)
    • 可以用 inout 定义一个输入输出参数,可以在函数内部修改外部实参的值
    var numb = 10
    
    func add(number: inout Int){
        number = 20
    }
    
    add(&numb)
    print(numb)
    
    • 可变参数不能标记为 inout
    • inout 参数不能有默认值
    • inout 参数的本质是地址传递(引用传递)
    • inout 参数只能传入可以被多次赋值的
    函数重载(Function Overload)
    • 规则
      • 函数名相同
      • 参数个数不同 || 参数类型不同 || 参数标签不同

    如下图所示:

    func sum (v1: Int , v2: Int) -> Int {
           return v1 + v2
    }
    
    func sum (v1: Int , v2: Int, v3: Int) -> Int {
           return v1 + v2 + v3
    }
    
    内联函数
    • 如果开启了编译器优化(Release模式默认会开启优化),编译器会自动将某些函数变成内联函数
      • 将函数调用展开成函数体
    image.png
    • 哪些函数不会被内联
      • 函数体比较长
      • 包含递归调用
      • 包含动态派发
    函数类型
    • 每一个函数都是有类型的,函数类型由形式参数类型返回值类型组成
    func test() {}
    
    func  sum (a:Int, b: Int)  ->  Int {
        a + b
    }
    
    函数类型作为函数返回值
    • 返回值是函数类型的函数,叫做 高阶函数
    嵌套函数
    • 将函数定义在函数内部
    func  forward (_ forward : Bool)  -> (Int)  ->  Int {
    
          func   next (_ input : Int)  ->  Int  {
               input + 1
          }
    }
    

    相关文章

      网友评论

          本文标题:第二课 流程控制、函数、汇编分析

          本文链接:https://www.haomeiwen.com/subject/feinzdtx.html