函數(shù)喷众,是用來完成特定任務(wù)的獨(dú)立的代碼塊,指定一個(gè)函數(shù)名莺债,在需要的時(shí)候可以多次調(diào)用滋觉。函數(shù)對于程序員來說并不陌生,今天要分享的就是Swift中函數(shù)的定義齐邦,調(diào)用椎侠,以及一些常見的用法。
(1)函數(shù)的定義和調(diào)用
在Swift中少梁,使用func關(guān)鍵字來定義函數(shù)菌湃,函數(shù)由函數(shù)名树肃,參數(shù),返回值組成浅悉,基本格式如下所示:
func 函數(shù)名(參數(shù)名1:參數(shù)類型,參數(shù)名2:參數(shù)類型...)->返回值類型{
函數(shù)體
return 返回值
}
func sum(x : Int, y : Int) -> Int {
return x + y
}
print(sum(x : 10, y: 20))
上面的代碼就定義了一個(gè)用于求和的函數(shù)券犁,函數(shù)的名字是sum术健,參數(shù)類型都為Int類型,返回值也是Int類型粘衬。
(2)函數(shù)的參數(shù)和返回值
在Swift中荞估,函數(shù)的 參數(shù)與返回值使用很靈活咳促,能夠定義任何類型的函數(shù),包括無參函數(shù)勘伺,多參數(shù)函數(shù)跪腹,無返回值函數(shù),多返回值函數(shù)娇昙,當(dāng)然這幾種還可以組合成無參無返回值尺迂,無參多返回值等等。冒掌。噪裕。
無參函數(shù)
func sayHello() -> String {
return "Hello!"
}
print(sayHello())
上面的代碼定義并且調(diào)用了一個(gè)無參有返回值函數(shù),無需解釋股毫。
多參數(shù)函數(shù)
函數(shù)的參數(shù)可以沒有膳音,也可以有1個(gè)或多個(gè)。在對函數(shù)定義舉例的時(shí)候那個(gè)例子铃诬,求和函數(shù)祭陷,就是一個(gè)多參數(shù)函數(shù),下面再做一個(gè)事例趣席,來展示多參函數(shù)兵志。
func sayHello(name : String, alreadyGreeted : Bool) -> String {
if alreadyGreeted {
return "Hello \(name)!"
} else {
return "Hello World!"
}
}
print(sayHello("miao", alreadyGreeted: false))
上面的sayHello函數(shù)中有兩個(gè)參數(shù),一個(gè)String類型的name宣肚,一個(gè)Bool類型的alreadyGreeted想罕,返回值為String類型,函數(shù)體中霉涨,通過對alreadyGreeted的判斷返回不同的字符串按价。。
無返回值的函數(shù)
無返回值函數(shù)的寫法有三種笙瑟,下面直接用代碼給出示例楼镐。
func test1() {
print("哈哈")
}
func test2() -> Void {
print("呵呵")
}
func test3() -> () {
print("吼吼")
}
test1()
test2()
test3()
上面所示的函數(shù),既是無返回值函數(shù)往枷,也是無參函數(shù)框产。
多返回值函數(shù)
是永遠(yuǎn)組類型作為函數(shù)的返回值,可以讓多個(gè)值作為一個(gè)復(fù)合值返回错洁。
下面我們來定義一個(gè)函數(shù)茅信,用于返回字符串中元音字母和輔音字母的數(shù)量。
func count(string:String) -> (vowels : Int, consonants : Int, others : Int) {
var vowels = 0, consonants = 0, others = 0
for character in string.characters {
switch String(character).lowercased() {
case "a","b","c","d","e":
vowels += 1
case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z" :
consonants += 1
default:
others += 1
}
}
return (vowels, consonants, others)
}
count("Welcome to 汪小喵的簡書")
(3)局部參數(shù)名和外部參數(shù)名
前面的代碼中定義的函數(shù)中墓臭,都為參數(shù)定義了參數(shù)名蘸鲸,這些參數(shù)名只能在函數(shù)本身的主題中使用,這種參數(shù)類型名稱稱為局部參數(shù)名窿锉,就不用再多解釋了酌摇。
下面來介紹外部參數(shù)名膝舅。
外部參數(shù)名,是指在參數(shù)名的前面在增加一個(gè)參數(shù)名窑多。如果為參數(shù)制定了外部參數(shù)名仍稀,調(diào)用的時(shí)候就必須顯示地使用。下面來舉個(gè)栗子:
func compare(num1 x : Int, num2 y : Int) -> Int {
return x > y ? x : y
}
compare(num1: 3, num2: 5)
從截圖中可以看到埂息,當(dāng)調(diào)用compare函數(shù)時(shí)技潘,Xcode會(huì)出現(xiàn)智能提示。
(4)函數(shù)參數(shù)的其他用戶
默認(rèn)參數(shù)值
給參數(shù)一個(gè)默認(rèn)值可以再調(diào)用該函數(shù)式省略這個(gè)參數(shù)千康。來看下面這個(gè)函數(shù)的定義和調(diào)用:
func sayHello(message : String, name : String = "小明") {
print("\(name),\(message)")
}
sayHello("歡迎來到簡書")
sayHello(message: "歡迎來到簡書", name: "喵喵")
可變參數(shù)
一個(gè)可變參數(shù)可以接受零個(gè)或者多個(gè)指定類型的值享幽。函數(shù)調(diào)用時(shí),使用可變參數(shù)來指定函數(shù)參數(shù)可以被傳入不確定數(shù)量的輸入值拾弃。在變量類型名后面加入“...”的方式來定義可變參數(shù)值桩。下面來定義一個(gè)計(jì)算平均值的函數(shù)。
func arithmenticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmenticMean(1,2,3,4,5.5)
In-Out參數(shù)
一般參數(shù)僅僅在函數(shù)內(nèi)部可以改變豪椿,當(dāng)這個(gè)函數(shù)執(zhí)行完后變量就會(huì)被銷毀奔坟,如果想要通過一個(gè)函數(shù)可以修改參數(shù)的值,并且讓這些修改在函數(shù)調(diào)用結(jié)束后仍然存在搭盾,這時(shí)可以將這個(gè)參數(shù)定義為輸入輸出參數(shù)咳秉。在參數(shù)類型的前面加上 inout 關(guān)鍵字就可以定義一個(gè)輸入輸出函數(shù)。
要注意的是鸯隅, inout 修飾的參數(shù)是不能有默認(rèn)值的澜建,也不能是有范圍的參數(shù)集合,另外滋迈,一個(gè)參數(shù)一旦被 inout修飾霎奢,就不能被let修飾了户誓。
func swapTwoInts(inout a : Int, inout b : Int) {
let temp = a
a = b
b = temp
}
var someInt = 3
var anotherInt = 9
swapTwoInts(&someInt, b: &anotherInt)
print(someInt, anotherInt)
從截圖中可以看到饼灿,在調(diào)用swapTwoInts函數(shù)的時(shí)候,參數(shù)前面都加上了&前綴帝美,盡管someInt和anotherInt在函數(shù)外部碍彭,仍然被交換了數(shù)值。
(5)嵌套函數(shù)
前面定義的函數(shù)都是全局函數(shù)悼潭,也就是定義在全局作用域中庇忌,除了全局函數(shù)外,還可以把函數(shù)定義在其他函數(shù)體中舰褪,就是嵌套函數(shù)皆疹。
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
default:
result = sub
}
return result
}
let f1:(Int, Int) ->Int = calculate("+")
print(f1(5,9))
上面的代碼中,函數(shù)只有一個(gè)參數(shù)占拍,返回值類型是 (Int,Int)->Int類型略就。代碼定義了兩個(gè)嵌套函數(shù)捎迫,用于加法和減法運(yùn)算。
函數(shù)的定義和基本用法就是這么多表牢,明天分享閉包