2016-07-13(Swift-函數(shù))

函數(shù)的概念:

函數(shù)是執(zhí)行特定任務(wù)的代碼自包含塊。給定一個(gè)函數(shù)名稱標(biāo)識(shí), 當(dāng)執(zhí)行其任務(wù)時(shí)就可以用這個(gè)標(biāo)識(shí)來進(jìn)行"調(diào)用"。

swift函數(shù)參數(shù)提供默認(rèn)值,以簡(jiǎn)化函數(shù)調(diào)用,并通過設(shè)置在輸入輸出參數(shù),在函數(shù)執(zhí)行完成時(shí)修改傳遞的變量。

函數(shù)的聲明、實(shí)現(xiàn)、調(diào)用:

語法:

func(函數(shù)聲明關(guān)鍵字) 函數(shù)名(參數(shù)名稱:參數(shù)數(shù)據(jù)類型,...)-> 返回?cái)?shù)據(jù)類型{函數(shù)體}

注意:聲明語法(若沒返回值,->開始可以省略,沒有參數(shù),括號(hào)放空即可)

func sum(num1:Double,num2:Double)->Double
{    
return num1 + num2
}
print(sum(10.5, num2: 20))

輸出結(jié)果:
30.5

//無返回值
func  fun (name:String)
{
if name .isEmpty
{
    print("空字符串")
}
else
{
    print("不是空字符串\(name)")
}
}
fun("張三") //調(diào)用函數(shù)

在swift中沒有單獨(dú)的函數(shù)聲明,直接實(shí)現(xiàn)即可.

注意:在swift中函數(shù)調(diào)用要在實(shí)現(xiàn)之后,參數(shù)的傳遞個(gè)數(shù)類型匹配,有返回值要處理.

課堂練習(xí):

自定義函數(shù),實(shí)現(xiàn)給個(gè)值求階乘,返回值輸出。

//給一個(gè)值,求階乘
func jiecheng(num:Double)->Double
{    
    var jiecheng:Double = 1    
for var i:Double = 1 ; i <= num ; i++    
{        
    jiecheng = jiecheng * i   
}       
return jiecheng
}
print(jiecheng(5))

輸出:
120.0
Program ended with exit code: 0


自定義函數(shù),求一個(gè)數(shù)的絕對(duì)值,返回并輸出結(jié)果。

//求一個(gè)數(shù)的絕對(duì)值
func jueduizhi(var num:Double)->Double
{    
    if num < 0    
{        
    num = -num    
}    
return num
}
print(jueduizhi(-9))

輸出:
9.0
Program ended with exit code: 0



函數(shù)的參數(shù):

函數(shù)的參數(shù)名有兩種:內(nèi)部參數(shù)名,外部參數(shù)名

內(nèi)部參數(shù)名:即函數(shù)內(nèi)部使用的參數(shù)名稱

外部參數(shù)名:即函數(shù)在調(diào)用的時(shí)候的參數(shù)描述
例如:

//求一個(gè)數(shù)的絕對(duì)值absNum:外部參數(shù)  num:內(nèi)部參數(shù)
func  absFun (absNum num:Double)->Double
{
   if num > 0 {  return num   }
    return -num
}
//absNum:外部參數(shù),描述參數(shù)的意義
print(absFun(absNum: 100))

函數(shù)的參數(shù)默認(rèn)值:

/**
 字符串拼接(str1拼接到str2后面)
 - parameterstr1: 字符串1
 - parameterstr2: str2給了默認(rèn)一個(gè)空格的值
 - returns: 拼接結(jié)果
 */
func joinStr (string str1:String,belowString str2:String = ":")->String
{
    return  "姓名" + str2 + str1
}
//有默認(rèn)值,調(diào)用的時(shí)候可以不填寫,外部參數(shù)也不要寫
print(joinStr(string: "張三"))

這里的參數(shù)“str2”若調(diào)用時(shí)不進(jìn)行賦值,則為默認(rèn)值“:”,若要修改默認(rèn)值可:

print(joinStr(string: "張三",str2: "="))

函數(shù)的參數(shù)在沒有修飾符的情況下默認(rèn)是let(只讀),若在函數(shù)內(nèi)部要修改參數(shù)值,則參數(shù)需要使用var。如下

//求一個(gè)數(shù)的絕對(duì)值absNum:外部參數(shù)  num:內(nèi)部參數(shù)
func  absFun (var absNum num:Double)->Double
{
    if num < 0  {
        num = -num
    }
    return num
}
var num1:Double = -100
//absNum:外部參數(shù),描述參數(shù)的意義
print(absFun(absNum: num1))
print(num1)

函數(shù)參數(shù) - 可變參數(shù):

一個(gè)可變參數(shù)的參數(shù)接受零個(gè)或多個(gè)指定類型的值。當(dāng)函數(shù)被調(diào)用時(shí),您可以使用一個(gè)可變參數(shù)的參數(shù)來指定該參數(shù)可以傳遞不同數(shù)量的輸入值。寫可變參數(shù)的參數(shù)時(shí),需要參數(shù)的類型名稱后加上點(diǎn)字符(...)。

示例:

/**
 求數(shù)學(xué)成績(jī)平均值
 - parameter scores: 一組數(shù)學(xué)成績(jī)(可變參數(shù))
 - returns: 返回平均成績(jī)
 */
func mathScoreAvg(scores: Double...) -> Double {
    var total: Double = 0
    for number in scores
    {
        total += number
    }
    return total / Double(scores.count)
}
print(mathScoreAvg(99,50.8,77,66.5,89))

函數(shù)參數(shù) - 輸入-輸出參數(shù):

前面所說的可變參數(shù),只能在函數(shù)本身內(nèi)改變。如果你想有一個(gè)函數(shù)來修改參數(shù)的值,并且想讓這些變化要堅(jiān)持在函數(shù)調(diào)用結(jié)束后,你可以定義輸入-輸出參數(shù)來代替。
通過在其參數(shù)定義的開始添加inout關(guān)鍵字寫用來標(biāo)明輸入-輸出參數(shù)。一個(gè)在輸入-輸出參數(shù)都有一個(gè)傳遞給函數(shù)的值,由函數(shù)修改后,并從函數(shù)返回來替換原來的值。

示例:求絕對(duì)值

//求一個(gè)數(shù)的絕對(duì)值absNum:外部參數(shù)  num:內(nèi)部參數(shù)  inout:描述num是一個(gè)輸入-輸出參數(shù)
func  absFun (inout absNum num:Double)->Double
{
    if num < 0
    {
        num = -num
    }
    return num
}
var num1:Double = -100
//absNum:外部參數(shù),描述參數(shù)的意義
print(absFun(absNum: &num1))//類似地址傳參
print(num1)

函數(shù)類型:

在swift中每一個(gè)函數(shù)都有特定的函數(shù)類型,可以充當(dāng)參數(shù)類型和函數(shù)的返回類型。

示例:

//加法函數(shù)
func sumTowInt(a:Int,b:Int)->Int
{
    return a + b
}
//乘法函數(shù)
func mutiplyTowInt(a:Int,b:Int)->Int
{
    return a * b
}
/** 帶有函數(shù)參數(shù)的結(jié)果打印函數(shù)  
- parameter funTowInt: 函數(shù)參數(shù) 
- parameter a:         整形參數(shù)1 
- parameter b:         整形參數(shù)2 
*/
func printResult(funTowInt:(Int,Int)->Int,a:Int,b:Int)
{
    print(funTowInt(a,b))
}
//存儲(chǔ)函數(shù)的變量
var funTemp:(Int,Int)->Int = sumTowInt //加法

printResult(funTemp, a: 10, b: 20)funTemp = mutiplyTowInt//乘法
printResult(funTemp, a: 10, b: 20)

輸出:
10
30
Program ended with exit code: 0



函數(shù)嵌套:

本章中遇到函數(shù)都是全局函數(shù),在全局范圍內(nèi)定義。其實(shí)你還可以在其他函數(shù)中定義函數(shù),被稱為嵌套函數(shù)。

嵌套函數(shù)默認(rèn)對(duì)外界是隱藏的,但仍然可以調(diào)用和使用其內(nèi)部的函數(shù)。內(nèi)部函數(shù)也可以返回一個(gè)嵌套函數(shù),允許在嵌套函數(shù)內(nèi)的另一個(gè)范圍內(nèi)使用。

//--------------嵌套函數(shù)--------------
/**前進(jìn)或者后退
- parameter choose: true:前進(jìn)  false:后退
- returns: 返回一個(gè)函數(shù)有整形參數(shù),并且返回一個(gè)整形數(shù)據(jù)的函數(shù)
*/
func chooseStepFunction(choose:Bool)->(Int)->Int
{
    //前進(jìn)函數(shù)
    func stepForward(input:Int)->Int
    {
        return input + 1
    }
    //后退函數(shù)
    func stepBack(input:Int)->Int
    {
        return input - 1
    }
    return choose ? stepForward : stepBack //三目運(yùn)算符
}
//函數(shù)變量
let f:(Int)->Int = chooseStepFunction(true)//前進(jìn)
print(f(100))//內(nèi)部函數(shù)調(diào)用
//聲明函數(shù)變量并調(diào)用
print(chooseStepFunction(false)(100))//后退

輸出:
10199
Program ended with exit code: 0



常見錯(cuò)誤:

函數(shù)實(shí)現(xiàn)必須在調(diào)用之前,函數(shù)沒有聲明
函數(shù)實(shí)現(xiàn)的語法,參數(shù)語法,返回值語法
函數(shù)調(diào)用時(shí)注意參數(shù)嚴(yán)格一致,有返回值要處理
函數(shù)的參數(shù)沒有指定修飾符,則為let不可變。
函數(shù)在適應(yīng)輸入輸出參數(shù)時(shí),是var類型 ,var不許要書寫。
函數(shù)變量的聲明,注意參數(shù)類型及返回值,語法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 86.復(fù)合 Cases 共享相同代碼塊的多個(gè)switch 分支 分支可以合并, 寫在分支后用逗號(hào)分開。如果任何模式...
    無灃閱讀 1,552評(píng)論 1 5
  • 本章將會(huì)介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語句Switch 語句控制轉(zhuǎn)移語句 continu...
    寒橋閱讀 803評(píng)論 0 0
  • 函數(shù)是用來完成特定任務(wù)的獨(dú)立的代碼塊。給一個(gè)函數(shù)起一個(gè)合適的名字,用來標(biāo)識(shí)函數(shù)做什么,并且當(dāng)函數(shù)需要執(zhí)行的時(shí)候,這...
    窮人家的孩紙閱讀 860評(píng)論 2 1
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,688評(píng)論 9 118
  • 今天還是要聽小女生的歌,不過這次是三個(gè)小女生。 一首很老的歌《不想長(zhǎng)大》。 曾經(jīng)我們是沒有水晶鞋的灰姑娘,一次次聽...
    樂非揚(yáng)閱讀 331評(píng)論 0 0

友情鏈接更多精彩內(nèi)容