美文网首页swift学习
Swift5.1 - 函数(3)

Swift5.1 - 函数(3)

作者: HChase | 来源:发表于2019-06-24 19:18 被阅读24次

1. 函数定义

  • 无返回值;
    func add(a: Int, b: Int) {
        return a + b
    }
  • 有返回值(使用 -> 来定义返回);
    func add(a: Int, b: Int) -> Int {
        return a + b
    }
  • 行参默认是let,不能为var;
  • 隐式返回(只能在swift5.1及以上有效,只有一行代码,默认返回);
    func add(a: Int, b: Int) -> Int {
        a + b
    }
  • 返回元组:实现多值返回;
    func calculation(a: Int, b: Int) -> (add: Int, sub: Int, mul: Int) {
        return (a+b, a-b, a*b)
    }

    print(calculation(a: 3, b: 2))
    // (add: 5, sub: 1, mul: 6)

2. 函数文档注释

    /// 求和【慨述】
    /// 将2个整数进行相加
    ///
    /// - Parameter a: 第一个整数
    /// - Parameter b: 第二个整数
    /// - Returens: 两个整数的和
    ///
    /// - Notes: 传入2个整数【批注】
    ///
    func add(a: Int, b: Int) -> Int {
        a + b
    }
  • 按 option + 鼠标左键,点击add


3. 参数标签

  • 参数的标签可以修改;
    func add(val1 a: Int, var2 b: Int) -> Int {
        a + b
    }

    add(val1: 1, var2: 2)
  • 用下划线 _ 省略参数标签;
    func add(_ a: Int, _ b: Int) -> Int {
        a + b
    }

    add(1, 2)

4. 设置参数默认值

    func add(a: Int = 0, b: Int) -> Int {
        a + b
    }

    print( add(b: 2) ) // 2

5. 可变参数

    func test(_ nums: Int...) -> Int {
        
        var sum = 0
        for num in nums {
            sum += num
        }
        return sum
    }

    print( test(1, 2, 3, 4) )  // 10
  • 一个函数 最多只能有1个 可变参数;
  • 紧跟在可变参数后面的参数,不能省略参数标签;


6. 输入输出参数

  • 使用 inout 定义一个输入输出参数:可以在函数内部修改外部参数的值;
    func swapV(v1: inout Int, v2: inout Int)  {
        (v2, v1) = (v1, v2)
    }

    var v1: Int = 10
    var v2: Int = 20
        
    swapV(v1: &v1, v2: &v2)
    print("v1 = \(v1), v2 = \(v2)")   // v1 = 20, v2 = 10
  • 可变参数 不能设置为 inout
  • inout 参数不能设置 默认值
  • inout 参数只能传入可以被多次赋值的;
  • inout 参数本质是 地址传递

7. 函数重载

函数重载的规则:

  1. 函数名相同;
  2. 参数个数不同、参数标签不同、参数类型不同;
    func add(a: Int, b: Int) -> Int {
        a + b
    }
    
    // 参数个数不同
    func add(a: Int, b: Int, c: Int) -> Int {
        a + b + c
    }
    
    // 参数类型不同
    func add(a: Int, b: Double) -> Int {
        a + Int(b)
    }
    
    // 参数标签不同
    func add(v1: Int, _ v2: Int) -> Int {
        v1 + v2
    }
  • 返回值类型 与函数重载无关;

8. 内联函数

  • 如果开启了编译器优化(release模式下,默认开启优化),编译器会自动将某些函数编程内联函数;
  • 将函数调用展开成函数体;


不会函数被自动内联:

  1. 函数体比较长;
  2. 包含递归调用;
  3. 包含动态派发;
  • @(inline) 的使用:
  1. @inline(never) 定义的函数,永远不会被内联
    @inline(never) func test() {
        print("aaaa")
    }
  1. 在release模式下,编译器会自动开启优化,决定哪个函数自动内联,因此在编写代码时没有必要使用 @(inline)

9. 函数类型

  • 每一个函数都是有类型的,函数类型由 形式参数类型返回值类型 组成;
   func test() {} // () -> Void 或者 () -> ()

   func add(a: Int, b: Int) -> Int {
       a + b
   } // (Int, Int) -> Int

   // 定义函数类型变量
   var fun:(Int, Int) -> Int = add
   fun(2, 4) // 6
  • 函数类型作为 函数的参数
    func add(a: Int, b: Int) -> Int {
        a + b
    } // (Int, Int) -> Int
    
    func printAdd(_ add: (Int, Int) -> Int, _ a: Int, _ b: Int) {
        let sum = add(a, b)
        print(sum) // 30
    }

    printAdd(add, 10, 20)
  • 函数作为 返回值
func next(_ input: Int) -> Int {
    input + 1
}

func previous(_ input: Int) -> Int {
    input - 1
}

func forward(_ forword: Bool) -> (Int) -> Int {
    forword ? next : previous
}

print( forward(false)(0) ) // -1
print( forward(true)(0) )  // 1
  • 返回值是函数类型的函数,叫做高阶函数

10. typealias

  • typealias 用来给类型起别名;
typealias Byte = Int8
typealias Char = Character
typealias Short = Int16
typealias Long = Int64

typealias Date = (year: Int, month: Int, day:Int)

func printDate(_ date: Date) {
    print(date.year)
    print(date.month)
    print(date.day)
}

printDate((2019, 9, 24))
  • Void是空元祖() ;
public typealias Void = ()

11. 嵌套函数

  • 将函数定义在函数内部;
func forward(_ forword: Bool) -> (Int) -> Int {
    
    func next(_ input: Int) -> Int {
        input + 1
    }
    
    func previous(_ input: Int) -> Int {
        input - 1
    }

    return forword ? next : previous
}

print( forward(false)(0) ) // -1
print( forward(true)(0) )  // 1

相关文章

  • Swift5.1 - 函数(3)

    1. 函数定义 无返回值; 有返回值(使用 -> 来定义返回); 行参默认是let,不能为var; 隐式返回(只能...

  • [Swift5.1] 3-函数

    函数定义 形参默认是let,也只能是let 无返回值 返回值()实质是空元组 隐式返回(Implicit Retu...

  • Swift5.1函数

    6.函数 多重返回值函数:用元组(tuple)类型让多个值作为一个复合值从函数中返回 func minMax(a...

  • Swift5.1——前言

    主要是针对Swift5.1,基础语法,和内部剖析。 基础语法 基础语法 流程控制 函数 枚举 可选项 为什么选择S...

  • 关于SwiftUI,Swift5.1之后的小感

    Swift5.1之前是一门语言,Swift5.1之后是另外一门语言,作为一个从Swift2.0开始就在持续学习这么...

  • Swift5.1基础

    github:https://github.com/w0shiliyang/Swift5.1

  • UINavigationController中UIViewCon

    运行环境:xcode11,swift5.1 在UINavigationController 重写pushViewC...

  • Swift系统视频学习

    1、swift5.1基础语法:https://docs.swift.org/swift-book/Language...

  • Swift5.1学习随笔之函数func

    Swift中的函数用func关键字定义 举个? 无返回值的函数 有3中表达写法 隐式返回 如果整个函数体是一个单一...

  • [Swift5.1] 26-函数式编程

    Array的常见操作 arr.map() : 遍历数组每一个元素, 每遍历一个元素调用一次闭包,将元素传入闭包,闭...

网友评论

    本文标题:Swift5.1 - 函数(3)

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