函數(shù)
函數(shù)就是對某個功能的封裝穷当,一個swift程序可能由多個函數(shù)組成
swift中定義函數(shù)的格式:
func 函數(shù)名稱(參數(shù)列表) —>函數(shù)返回值類型{
函數(shù)體
return
}
函數(shù)定義要素:
func
是定義函數(shù)的關(guān)鍵字
函數(shù)名名字:為了增強(qiáng)可讀性,函數(shù)的名稱只能用字母字符來命名,函數(shù)名稱以駝峰式命名法來命名
參數(shù)列表:可以帶多個參數(shù)认轨,也可以沒有參數(shù)
如果帶有多個參數(shù),格式為:參數(shù)名稱:類型標(biāo)注,參數(shù)名稱:類型標(biāo)注…
如果函數(shù)帶有多個參數(shù),調(diào)用函數(shù)的時候遥皂,向函數(shù)傳遞的數(shù)據(jù),類型必須要和定義參數(shù)的類型完全對應(yīng)
函數(shù)返回值類型:只要是Swift語言識別的類型刽漂,都可以作為函數(shù)的返回值類型
如果函數(shù)具有返回值 返回的內(nèi)容用return語句返回
return語句后面可以添加變量或者表達(dá)式
如果函數(shù)不具有返回值 return語句可以缺省
有以下三種寫法:
->返回值類型 同時缺省
寫成 ->()
寫成 ->Void
函數(shù)優(yōu)點:
讓代碼更具有模塊化演训,提高代碼的可讀性
讓代碼更容易修改和維護(hù)
增強(qiáng)代碼的復(fù)用性
無返回值,無參數(shù)函數(shù)
func printLine() -> String{
return “—————-”
}
print(printLine())
例子1:求取a + b的和贝咙,a = 10仇祭,b = 20
func sumNumber(){
let a = 10
let b = 20
print(a + b)
}
sumNumber() //調(diào)用函數(shù)
MARK
函數(shù)只有在調(diào)用的時候才會為函數(shù)中的變量和常量分配空間
函數(shù)如果一直沒有被調(diào)用,和沒有定義一樣颈畸,函數(shù)里的變量或常量都不占內(nèi)存
函數(shù)體重定義的常量和變量乌奇,生命周期從函數(shù)調(diào)用開始没讲,到函數(shù)調(diào)用結(jié)束為止,作 用域只在函數(shù)體內(nèi)
向例子1中定義的變量或者常量礁苗,我們稱為局部變量或者局部常量
全局變量的作用域爬凑,從定義位置開始,到下面的所有函數(shù)都能直接使用這個全部變量
帶參數(shù)试伙,無返回值函數(shù)
函數(shù)的參數(shù)默認(rèn)為隱式常量嘁信,在函數(shù)內(nèi)部不能進(jìn)行賦值操作,函數(shù)形參的作用只是用來接收調(diào)用函數(shù)時傳遞過來的數(shù)值
例子2:
func sumAAndB(a:Int,b:Int){
a + b
}
sumAAndB(10,b:20)
//調(diào)用函數(shù)
例子3:判斷從鍵盤輸入的字符是否為十六進(jìn)制的合法字符
func isNum(b: String){
if b.characters.count == 1{
let b = b[b.startIndex]
if b >= "0" && b <= "9" || b >= "a" && b <= "f" || b >= "A" && b <= "F"{
print("這個數(shù)是十六進(jìn)制的字符")
}else{
print("這個數(shù)不是十六進(jìn)制的字符")
}
}else{
print("不合法")
}
}
isNum(“k”)
調(diào)用函數(shù)
函數(shù)參數(shù)為多個不定項數(shù)據(jù)
如果函數(shù)參數(shù)個數(shù)不定疏叨,可以使用…格式來接收多個數(shù)據(jù)潘靖,相當(dāng)于接收一個數(shù)組
參數(shù)位置不定數(shù)據(jù)的參數(shù)只能定義一個
不定數(shù)據(jù)放在所有參數(shù)后面定義
例子4:
func getMoreNumber(num:Int…){
for i in num{
print(i)
}
}
調(diào)用函數(shù)
getMoreNumber(1,2,3)
打印結(jié)果
1
2
3
帶參數(shù),有返回值函數(shù)
例子5:
func sayGoodBye(personName: String,isSay: Bool) ->String{
if isSay{
return "我們已經(jīng)認(rèn)識了"
}else{
return sayHello(personName)
//函數(shù)遇到return語句就結(jié)束了蚤蔓,return后面的內(nèi)容不會被執(zhí)行
}
}
print(sayGoodBye("Kil", isSay: false))
如果函數(shù)的返回值存在不確定值卦溢,那么函數(shù)就要將返回值類型定義成可選類型:Int?返回值返回的為nil
例子6:
func divNum(a: Int,b: Int) -> Int?{
if b != 0{
return a / b
}else{
return nil
}
}
print(divNum(4, b: 0))
函數(shù)內(nèi)部實現(xiàn)改變函數(shù)外部參數(shù)的值
定義函數(shù)時的參數(shù)稱為形參秀又,函數(shù)調(diào)用傳遞的參數(shù)单寂,稱為實參,inout參數(shù)實現(xiàn)了形參的值能被修改的功能
例子7:交換兩個數(shù)的值
func swap(inout a: Int,inout b: Int){
let tmp = a
a = b
b = tmp
}
調(diào)用函數(shù)
var m = 10
var n = 30
swap(&m, b: &n)
print(m,n)
實參向形參傳遞數(shù)值吐辙,我們稱之為值傳遞宣决,值傳遞是不能修改實參的值的
實參向形參傳遞地址,我們稱之為地址傳遞昏苏,地址傳遞可以修改實參的值
例子8:編寫一個函數(shù)尊沸,函數(shù)傳入一個無序的整形數(shù)組,函數(shù)無返回值贤惯,函數(shù)的功能是講傳入的數(shù)組實現(xiàn)從小到大排序
func sort(inout a: [Int]){
a.sortInPlace()
}
調(diào)用函數(shù)
var arr = [1,5,3,23,65,23,12]
sort(&arr)
print(arr)
外部參數(shù)與函數(shù)類型
func getPan(width: Int,height: Int) ->Int {
return (width + height) * 2
}
調(diào)用函數(shù)
print(getPan(10, height: 20))//此處的height就是隱式的外部參數(shù)洼专,因為此處的外部參數(shù)和內(nèi)部參數(shù)是同一個
**內(nèi)部參數(shù)就是離冒號近的參數(shù)名稱,用于參與函數(shù)內(nèi)部運(yùn)算
外部參數(shù)就是離冒號遠(yuǎn)的參數(shù)名稱救巷,用于函數(shù)調(diào)用時增強(qiáng)代碼的可讀性**,如:
func getArea(寬 width: Int,高 height: Int)->Int {
return width * height
}
此處的寬句柠、高就是外部參數(shù)
外部參數(shù)名稱缺省
func personInfo(name: String, _ age: Int) ->String//用_ 代表外部參數(shù)缺省
{
return name + "\(age)"
}
調(diào)用函數(shù)
print(personInfo("小明", 19))
參數(shù)帶有默認(rèn)值
func shape(width: Int = 100) {
print(width * width)
}
函數(shù)的參數(shù)默認(rèn)是隱式常量浦译,在函數(shù)體內(nèi)不能賦值,但是可以在定義參數(shù)的同時直接初始化
函數(shù)的重載
程序中定義多個同名函數(shù)溯职,函數(shù)的返回值類型或者函數(shù)的參數(shù)列表不同精盅,這種形式稱為函數(shù)重載
原函數(shù):
func getStudentInfo(name: String) {
print(name)
}
函數(shù)重載1:函數(shù)名相同,參數(shù)列表不同
func getStudentInfo(name: String,age: Int) {
print(name + "\(age)")
}
函數(shù)重載2:函數(shù)名相同谜酒,參數(shù)列表相同叹俏,函數(shù)返回值不同
func getStudentInfo(name: String) ->String {
return name
}