Swift之函數

本文首發於個人我的博客c++

函數定義

  • 形參默認是let 而且只能是let
  1. 無參無返回值

能夠省略Void 也能夠不省略,以下三種均可以git

func sayHello(){
    print("hello")
}

func sayHello() -> (){
    print("hello")
}

func sayHello() -> (Void){
    print("hello")
}
複製代碼
  1. 無參有返回值
func pi() -> Double {
        return 3.1415
    }
  
複製代碼
  1. 有參有返回值
func sum(a: Int, b: Int) -> Int {
        return a + b
    }
複製代碼

隱式返回

  • 若是函數體是個單一表達式,那麼函數會返回這個表達式 好比上面的代碼能夠去掉 return 寫成
func sum(a: Int, b: Int) -> Int {
        a + b
    }
複製代碼

返回元組:能夠實現多返回值

例如github

func calculate(a: Int, b: Int) -> (sum: Int, average: Int) {
        let sum = a + b
        return (sum, sum >> 1)
   }
   調用 calculate(a: 2, b: 8)
   返回 (sum: 10, average: 5)
複製代碼

文檔註釋

  • 把光標定位到須要添加註釋文檔的對象起始行,或上方的空白行。按下「command + Option + /」,即「⌘ + ⌥ + /」。(若是是 Windows 鍵盤則爲「Win鍵 + ALT + /」)

例如上文代碼增長註釋編程

/// 計算兩個數之和
    ///
    /// - Parameters:
    ///   - a: 第一個參數
    ///   - b: 第二個參數
    /// - Returns: 返回兩個參數之和
    func sum(a: Int, b: Int) -> Int {
        return a + b
    }
複製代碼

參數標籤

  • 能夠修改參數標籤
func goToWork(at time: String) -> () {
        print("this time is \(time)")
    }
複製代碼
  • 可使用下劃線 _ 省略參數標籤
func sum2(_ a: Int, _ b: Int) -> Int {
        return a + b
    }
複製代碼

默認參數值

  • 同C++ 中同樣參數能夠有默認值
  • 可是C++裏面默認參數有個限制:必須從右向左設置。而Swift中擁有參數標籤,因此沒有這個限制
定義:func check(name: String = "jack", age: Int, job: String = "teacher") {
        print("name = \(name), age = \(age), job = \(job)")
    }
    
 調用:check(age: 22)
 
 輸出: name = jack, age = 22, job = teacher
複製代碼

可變參數

例如:bash

func sum(_ numbers: Int...) -> Int{
        var total = 0
        for num in numbers {
            total += num
        }
        return total
    }
	
	調用: sum(1,2,3)
複製代碼
  • 一個函數最多隻能有一個可變參數
  • 緊跟着可變參數後面的參數不能省略參數標籤(不然編譯起來有歧義)

例如app

// 參數string 不能省略標籤
 func test(_ numers: Int..., string: String) -> Void {
        
    }

複製代碼

輸入輸出參數

  • 前面說了形參只能是let,可是若是咱們想再內部修改外部實參的值,能夠用 inpot 定義輸入輸出參數

例如函數

func swapValues(_ v1: inout Int, _ v2: inout Int) {
        let tmp = v1
        v1 = v2
        v2 = tmp
        //前面三行也能夠換成  (v1, v2) = (v2, v1) 效果同樣
    }
    
     var num1 = 10
     var num2 = 20
     swapValues(&num1, &num2)
    print("num1 = \(num1), num2 = \(num2)")
       
     輸出: num1 = 20, num2 = 10 
        
複製代碼

注意點:ui

  • 可變參數不能標記爲input
  • input參數不能有默認值
  • input參數的本質是地址傳遞(引用傳遞)
  • input參數只能傳入能夠被屢次賦值的

函數重載

規則

  • 函數名相同
  • 參數個數不一樣 或者 參數類型不一樣 或者 參數標籤不一樣

注意點是:this

  • 返回值類型與函數重載無關
  • 默認參數值和函數重載一塊兒使用產生二義性時候,編譯器不會報錯(c++中會報錯)

例如spa

func sum(v1: Int, v2: Int) -> Int {
        v1 + v2
    }
    func sum(v1: Int, v2: Int, v3: Int = 10) -> Int {
        v1 + v2 + v3
        
    }
    
    // 會調用sum(v1: Int, v2: Int) 
    sum(v1: 10, v2: 20)
複製代碼
  • 可變參數、省略參數標籤、函數重載一塊兒使用產生二義性時,編譯器有可能會報錯
func sum(v1: Int, v2: Int) -> Int { v1 + v2
    }
    func sum(_ v1: Int, _ v2: Int) -> Int {
        v1 + v2 }
    func sum(_ numbers: Int...) -> Int { var total = 0
        for number in numbers {
            total += number
        }
        return total
    }
    // error: ambiguous use of 'sum'
    sum(10, 20)
複製代碼

函數類型

  • 每個函數都是有類型的,函數類型由形式參數類型、返回值類型組成
func test() { } // () -> Void 或者 () -> ()
    func sum(a: Int, b: Int) -> Int {
        a+b
    } // (Int, Int) -> Int
    // 定義變量
    var fn: (Int, Int) -> Int = sum
    調用: fn(2, 3)
複製代碼

函數類型做爲函數參數

例如

func sum(v1: Int, v2: Int) -> Int {
        v1 + v2
    }
    func difference(v1: Int, v2: Int) -> Int {
        v1 - v2
        
    }
    // 用一個函數類型做爲參數 上面兩個函數類型都是 (Int, Int) -> Int
    func printResult(_ mathFn: (Int, Int) -> Int, _ a: Int, _ b: Int) { print("Result: \(mathFn(a, b))")
    }
    // 調用
    printResult(sum, 5, 2) // Result: 7
    printResult(difference, 5, 2) // Result: 3
複製代碼

返回值是函數類型的函數

  • 返回值是函數類型的函數,叫作高階函數(Higher-Order Function)
func next(_ input: Int) -> Int {
        input + 1
    }
    
    func previous(_ input: Int) -> Int {
        input - 1 
    }
        
    func forward(_ forward: Bool) -> (Int) -> Int {
        forward ? next : previous
    }
    //調用
    forward(true)(3) //  4  至關於 調用 next(3)
    forward(false)(3) // 2 至關於 調用 previous(3)
複製代碼

typealias 別名

  • 用來給類型起別名
typealias Date = (year: Int, month: Int, day: Int)
    func test(_ date: Date) {
        print(date.0)
        print(date.year)
        
    }
    // 調用
	// test((2011, 9, 10))
複製代碼

嵌套函數

  • 將函數定義在函數內部
func forward(_ forward: Bool) -> (Int) -> Int { func next(_ input: Int) -> Int {
        input + 1 }
        func previous(_ input: Int) -> Int { input - 1
        }
        return forward ? next : previous
    }
    
    forward(true)(3) // 4
    forward(false)(3) // 2
複製代碼

參考資料:

Swift官方源碼

從入門到精通Swift編程

更多資料,歡迎關注我的公衆號,不定時分享各類技術文章。

相關文章
相關標籤/搜索