函數(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ù)類型及返回值,語法