swift学习

Swift5.1 - 函数(3)

2019-06-24  本文已影响24人  HChase

1. 函数定义

    func add(a: Int, b: Int) {
        return a + b
    }
    func add(a: Int, b: Int) -> Int {
        return a + b
    }
    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
    }

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

6. 输入输出参数

    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

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. 内联函数

不会函数被自动内联:

  1. 函数体比较长;
  2. 包含递归调用;
  3. 包含动态派发;
  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 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))
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
上一篇 下一篇

猜你喜欢

热点阅读