天天看點

13.Swift學習之函數

函數的介紹

  • 函數相當于OC中的方法
  • 函數的格式如下
func 函數名(參數清單) -> 傳回值類型 {
    代碼塊
    return 傳回值
}
           
  • func

    是關鍵字,多個參數清單之間可以用逗号

    ,

    分隔,也可以沒有參數
  • 使用箭頭

    ->

    指向傳回值類型
  • 如果函數沒有傳回值,傳回值為Void 并且

    -> 傳回值類型

    部分可以省略

常見的函數類型

  • 沒有參數,沒有傳回值
func about() -> Void {
    print("iPhone Xs Max")
}
// 調用函數
about()

// 簡單寫法
// 如果沒有傳回值,Void可以寫成()
func about1() -> () {
    print("iPhone Xs Max")
}
about1()

// 如果沒有傳回值,後面的内容可以都不寫
func about2() {
    print("iPhone Xs Max")
}

about2()
           
  • 有參數,沒有傳回值
func call(phoneNum : String) {
    print("打電話給\(phoneNum)")
}
call("18888888888")
           
  • 沒有參數,有傳回值
func readMessage() -> String {
    return "吃飯了嗎?"
}
var str = readMessage()
print(str)
           
  • 有參數,有傳回值
func sum(num1 : Int, num2 : Int) -> Int {
    return num1 + num2
}
var result = sum(num1: 20, num2: 30)
print(result)
           
  • 傳回值為複雜類型
import Foundation

func triple(info:String) -> (name:String, age:Int) {

    let infos = info.components(separatedBy: ",")
    
    return (infos[0], Int(infos[1])!)

}

let p:(name:String, age:Int) = triple(info: "zhangsan,20")
p.name
p.age
           

函數的使用注意

  • 注意一: 函數的參數雖然沒有用var和let修飾,但它是常量,不能在函數内修改
func say(message:String) {
    //報錯:Cannot assign to value: 'message' is a 'let' constant
    message = "Hello Swift"  
    print("說話内容:\(message)")  
}
           
  • 注意二: 每一個函數的形式參數都包含

    形式參數标簽

    形式參數名

    兩部分
    • 形式參數标簽用在調用函數的時候
    • 形式參數名用在函數的實作當中
    • 在調用函數的時候每一個形式參數前邊都要寫形式參數标簽
    • 預設情況下,形式參數使用它們的形式參數名作為形式參數标簽
    • 如果不想要形式參數标簽,可以在參數名稱前加

      _

func minus(num1 a :Int,num2  b:Int) -> Int {  
    return a - b
}
minus(num1: 5, num2: 2)

func multi(_ a :Int,_  b:Int) -> Int {  
    return a * b
}
multi(2, 3)
           
  • 注意三: 預設參數
    • 某些情況,如果沒有傳入具體的參數,可以使用預設參數
func makecoffee(type :String = "卡布奇諾") -> String {
    return "制作一杯\(type)咖啡。"
}

let coffee1 = makecoffee(type: "拿鐵")
let coffee2 = makecoffee()
           
  • 注意四: 可變參數
    • Swift中函數的參數個數可以變化,可接受不确定數量的參數
    • 參數必須具有相同的類型
    • 可以通過在參數類型名後面加入

      ...

      的方式來訓示可變參數
func total(numbers:Int...) -> Int {
    var sum = 0 
    for i in numbers {       
        sum += i
    }    
    return sum
}

total()
total(numbers:10)
total(numbers:10,20)
total(numbers:10,20,30)
           
  • 注意五: 引用類型(指針的傳遞)
    • 預設情況下,函數的參數是值傳遞.如果想改變外面的變量,則需要傳遞變量的位址
    • Swift提供的

      inout

      關鍵字可以實作
func swapInt(a: inout Int, b: inout Int) {
    let tmp = a
    a = b
    b = tmp
}

var a = 10
var b = 20
print("a=\(a), b=\(b)")
swapInt(a: &a, b: &b)
print("a=\(a), b=\(b)")
           
  • 注意六: 函數的嵌套使用
    • Swift中函數可以嵌套使用
    • 即函數中包含函數,但是不推薦該寫法
// 函數的嵌套
let value = 55
func test() {
    func demo() {
        print("demo \(value)")
    }

    print("test")
    demo()
}

demo() // 錯誤
test() // 執行函數會先列印'test',再列印'demo'
           

函數的類型

  • 函數類型的概念
    • 函數是引用類型
    • 每個函數都有屬于自己的類型,由函數的

      參數類型

      傳回類型

      組成
    • 有了函數類型以後,就可以把函數類型像Int、Double、Array來用
    • 下面的例子中定義了兩個函數:addTwoInts 和 multiplyTwoInts,這兩個函數都傳入兩個 Int 類型參數,傳回一個Int類型值,是以這兩個函數的類型是

      (Int, Int) -> Int

// 定義兩個函數
func addTwoInts(a : Int, b : Int) -> Int {
    return a + b
}

func multiplyTwoInt(a : Int, b : Int) -> Int {
    return a * b
}
           
  • 抽取兩個函數的類型,并且使用
// 定義函數的類型
var mathFunction : (Int, Int) -> Int = addTwoInts

// 使用函數的名稱
mathFunction(10, 20)

// 給函數類型變量指派其他值
mathFunction = multiplyTwoInt

// 使用函數的名稱
mathFunction(10, 20)
           
  • 函數作為函數的參數
// 将函數的類型作為函數的參數
func printResult(a : Int, b : Int, calculateMethod : (Int, Int) -> Int) {
    print(calculateMethod(a, b))
}

printResult(a: 10, b: 20, calculateMethod: addTwoInts)
printResult(a: 10, b: 20, calculateMethod: multiplyTwoInt)
           
  • 函數作為函數的傳回值
//定義兩個函數
func addTwoInts(a : Int, b : Int) -> Int {
    return a + b
}

func multiplyTwoInt(a : Int, b : Int) -> Int {
    return a * b
}

//函數作為傳回值
func getResult(a:Int) -> (Int, Int)->Int{
    if a > 10 {
        return addTwoInts
    }
    else{
        return multiplyTwoInt
    }
}
//調用傳回的函數
getResult(a: 2)(10,20)
getResult(a: 12)(10,20)