Swift--函數

使用函數

func 函數名(參數列表)->返回值類型 {
語句組
return 返回值
}

傳遞參數
未使用外部參數名
func rectangleArea(width: Double, height: Double) -> Double           {
    let area = width * height
    return area
}

print("320X480的長方形的面積:\(rectangleArea(width: 320, height: 480))")
使用外部參數名
func rectangleArea2(W width:Double, H height: Double) ->Double {
    let area = width * height
    return area
}
print("320X480的長方形的面積:\(rectangleArea2(W: 320, H: 480))")
省略外部參數名
func rectangleArea3(W width:Double, _ height: Double) ->Double {
    let area = width * height
    return area
}

print("320X480的長方形的面積:\(rectangleArea3(W: 320, 480))")
參數默認值
func makecoffee (type: String = "卡布奇諾") -> String {
    return "制作一杯\(type)咖啡。"
}

let cof1 = makecoffee(type: "拿鐵")
let cof2 = makecoffee()//沒有傳type值,則為默認參數值“卡布奇諾”

print(cof1) //輸出:制作一杯拿鐵咖啡。
print(cof2)//輸出:制作一杯卡布奇諾咖啡。
可變參數
參數類型名后面加入(...)的方式,來指示這是可變參數。
func sum(numbers: Double...) ->Double {
    var total: Double = 0
    for number in numbers {
        total += number
   }
    return total
}

//可傳入不同數量的參數
print(sum(numbers: 100.0, 20, 30))//參數類型必須相同
print(sum(numbers: 30, 80))
參數的傳遞引用

如果我們一定要將一個值類型參數作為引用傳遞,Swift提供了inout關鍵字,可以實現這個目的。

//參數的傳遞引用
func increment(value: inout Double, amount: Double = 1.0) {
    value += amount
}

var value = 10.1

increment(value: &value)// &符號說明這是一種傳入傳出類型的參數

print(value) // 輸出:11.1  成功改變了函數外部變量value的值

注: inout修飾的參數是不能有默認值的,有范圍的參數集合也不能被修飾; 一個參數一旦被inout修飾,就不能再被var和let修飾了。

函數返回值
無返回值

func 函數名(參數列表){
語句組
}
func 函數名(參數列表)->(){
語句組
}
func 函數名(參數列表)->void{
語句組
}

多返回值函數
  • 一種方法是:將函數的多個參數聲明為引用類型傳遞。
  • 另一種方法是:返回元組類型。

//多返回值
//(x:Int, y:Int) 是一個元組類型
func postion(dt: Double, speed:(x:Int, y:Int))->(x:Int, y:Int) {
    let posx: Int = speed.x * Int(dt)
    let posy: Int = speed.y * Int(dt)

    return (posx, posy)
}
函數類型

每個函數都有一個類型,使用函數的類型與使用其他數據類型一樣,可以聲明變量或常量,也可以作為其他函數的參數或者返回值使用。

func syHello(){
print("Hello, World")
}
函數類型是()->()

func rectangleArea4(width: Double, height: Double)-> Double {
...
}
函數類型是(Double, Double)->Double

:函數類型作為一種數據類型,本質上與其他數據類型沒有區別。作為數據類型可以出現在3種情況下:

1、聲明變量或常量的類型。
2、指定函數中參數的類型。
3、指定函數返回值的類型。

作為函數返回類型使用

我們可以把函數類型作為另一個函數的返回類型使用。

//把函數類型作為另一個函數的返回類型使用

//定義計算長方形面積函數
//函數類型:(Double, Double)->Double
func rectangleArea4(width: Double, height: Double)-> Double {
    let area = width * height
    return area
}

//定義計算三角形面積函數
//函數類型:(Double, Double)->Double
func triangleArea(bottom: Double, height: Double) -> Double     {
    let area = 0.5 * bottom * height
    return area
 }

func getArea(type: String) -> (Double, Double) -> Double {
var returnDunction: (Double, Double) -> Double

    switch (type) {
    case "rect":
        returnDunction = rectangleArea4
    case "tria":
        returnDunction = triangleArea
    default:
        returnDunction = rectangleArea4
    }
    return returnDunction
}

//獲得計算三角形面積函數
var area: (Double, Double) -> Double = getArea(type: "tria")
print("底10 高15, 三角形面積:\(area(10, 15))")

//獲得計算長方形面積函數
area = getArea(type: "rect")
print("底10 高15, 長方形面積:\(area(10, 15))")
作為參數類型使用

我們可以把函數類型作為另一個函數的參數類型使用。

//把函數類型作為另一個函數的參數類型使用。
//定義計算長方形面積函數

//函數類型:(Double, Double)->Double
func rectangleArea4(width: Double, height: Double)-> Double {
    let area = width * height
    return area
}

//定義計算三角形面積函數
//函數類型:(Double, Double)->Double
func triangleArea(bottom: Double, height: Double) -> Double   {
    let area = 0.5 * bottom * height
    return area
}

func getAreaByFunc(funcName:(Double, Double) -> Double, a: Double, b: Double) -> Double {
    let area = funcName(a, b)
    return area
}

//獲得計算三角形面積函數
var result: Double = getAreaByFunc(funcName: triangleArea, a: 10, b: 15)
print("底10 高15, 三角形面積:\(result)")

//獲得計算長方形面積函數
result = getAreaByFunc(funcName: rectangleArea4, a: 10, b: 15)
print("寬10 高15,計算長方形面積:\(result)")

:元組類型與函數類型的區別。

  • (x:Int, y:Int)是一個元組,需要有字段名(x:)和類型
  • (Double, Double)->Double是函數類型,只有類型,沒有字段名,有返回值->Double。
函數嵌套

我們可以把函數定義在另外的函數體中,稱作“嵌套函數”。

////函數嵌套
func calculate(opr: String)->(Int, Int) -> Int{
    //定義 + 函數
    func add(a: Int, b: Int) -> Int {
        return a + b
    }

    //定義 - 函數
    func sub(a:Int, b: Int) -> Int {
        return a - b
    }

    var result: (Int, Int) -> Int
    switch (opr) {
    case "+":
        result = add
    case "-":
        result = sub
    default:
        result = add
    }
    return result
}

let f1: (Int, Int) -> Int = calculate(opr: "+")
print("10 + 5 = \(f1(10, 5))")
let f2: (Int, Int) -> Int = calculate(opr: "-")
print("10 - 5 = \(f2(10, 5))")
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發現簡書還為我保存起的...
    Jenaral閱讀 2,808評論 2 9
  • 函數是用來完成特定任務的獨立的代碼塊。給一個函數起一個合適的名字,用來標識函數做什么,并且當函數需要執行的時候,這...
    窮人家的孩紙閱讀 814評論 2 1
  • 函數 函數是一段完成特定任務的獨立代碼片段。你可以通過給函數命名來標識某個函數的功能,這個名字可以被用來在需要的時...
    Longshihua閱讀 369評論 0 0
  • 函數是一段完成特定任務的獨立代碼片段。你可以通過給函數命名來標識某個函數的功能,這個名字可以被用來在需要的時候"調...
    CDLOG閱讀 210評論 0 0
  • 函數是用來完成特定任務的獨立的代碼塊。可以給函數起一個名字,用于標識一個函數,當函數需要執行的時候,這個名字就會用...
    EndEvent閱讀 746評論 1 3