Swift的統(tǒng)一的功能語法足夠靈活的播掷,可表達(dá)任何東西,無論是不帶參數(shù)名稱的簡單的樣式函數(shù)撼班,還是帶本地和外部參數(shù)名稱的復(fù)雜的Objective-C樣式方法歧匈。參數(shù)可為簡單函數(shù)調(diào)用提供默認(rèn)值,并且可以被作為輸入/輸出參數(shù)傳遞砰嘁,在函數(shù)執(zhí)行完成時(shí)修改傳遞來的變量件炉。
Swift中的每個(gè)函數(shù)都有一個(gè)類型勘究,包括函數(shù)的參數(shù)類型和返回類型。你可以像使用Swift中其他類型一樣使用該類型,這使得它很容易將函數(shù)作為參數(shù)傳遞給其他函數(shù),甚至從函數(shù)中返回函數(shù)類型斟冕。?函數(shù)也可以被寫入其他函數(shù)中以在函數(shù)作用于中封裝有用的功能口糕。
定義和調(diào)用函數(shù)
當(dāng)定義一個(gè)函數(shù)時(shí),可以選擇性的定義一個(gè)或者多個(gè)名稱磕蛇,類型值作為函數(shù)的輸入(稱為行參)走净,或者定義一個(gè)函數(shù)結(jié)束后返回值的類型(稱之為返回型)。每一個(gè)函數(shù)都有一個(gè)函數(shù)名孤里,用來描述函數(shù)的執(zhí)行任務(wù)。要使用一個(gè)函數(shù)時(shí)橘洞,可使用它的名稱進(jìn)行“調(diào)用”捌袜,并通過它的輸入值(稱為實(shí)參--argument)來匹配函數(shù)的參數(shù)類型。一個(gè)函數(shù)的實(shí)參(arguments)必須始終和函數(shù)形參(parameter)順序一致炸枣。
函數(shù)的形參和返回值
在swift中虏等,函數(shù)的形參和返回值是非常具有靈活性的∈食Γ可以定義任何事情霍衫,無論是一個(gè)簡單的僅有一個(gè)未命名形參的工具函數(shù),還是那種具有豐富的參數(shù)名稱和不同的形參選項(xiàng)的復(fù)雜函數(shù)侯养。
多輸入形參
函數(shù)可以有多個(gè)輸入形參敦跌,把它們寫到函數(shù)的括號內(nèi),并用逗號加以分隔逛揩。下面這個(gè)函數(shù)設(shè)置了一個(gè)半開區(qū)間的開始和結(jié)束索引柠傍,用來計(jì)算在范圍內(nèi)有多少元素:
func halfOpenRangeLength(start: Int, end: Int) -> Int {
return end - start
}
print(halfOpenRangeLength(start: 1, end: 10))無形參函數(shù)
函數(shù)并沒有要求一定要定義的輸入形參。下面就是一個(gè)沒有輸入形參的函數(shù)辩稽,任何時(shí)候調(diào)用時(shí)惧笛,它總是返回相同的String消息:
func sayHelloWorld() -> String {
return "Hello, word"
}
print(sayHelloWorld())
該函數(shù)的定義還需要在函數(shù)的名稱后跟一對兒圓括號,即使它不帶任何形參逞泄。當(dāng)函數(shù)被調(diào)用時(shí)患整,函數(shù)名稱也要跟著一對空括號。無返回值的函數(shù)
函數(shù)不需要定義一個(gè)返回類型喷众。這里有一個(gè)版本的sayHello函數(shù)各谚,稱為waveGoogBye,他會(huì)打印自己的值侮腹,而不是返回它:
func sayHelloWorld() -> String {
return "Hello, word"
}
sayGoodbye(personName: "Autumn")
因?yàn)樗⒉恍枰祷匾粋€(gè)值嘲碧,該函數(shù)的定義不包括返回箭頭(->)和返回類型。
提示:嚴(yán)格地說父阻,sayGoodbye函數(shù)確實(shí)還返回一個(gè)值
即使沒有定義返回值愈涩。
沒有定義返回類型的函數(shù)返回了一個(gè)Void類型的特殊值望抽。
這僅是一個(gè)空元組,這里邊沒有元素履婉,可以被寫成()煤篙。當(dāng)一個(gè)函數(shù)調(diào)用時(shí)他的返回值可以忽略不計(jì):
print(sayHelloWorld())
func printAndCount(stringToPrint: String) -> Int{
print(stringToPrint)
return stringToPrint.characters.count
}
func printWithoutCounting(stringToPrint: String) {
print(printAndCount(stringToPrint: stringToPrint))
}多返回值函數(shù)
可以使用一個(gè)元祖類型作為函數(shù)的返回類型,來返回一個(gè)由多個(gè)值組成的復(fù)合返回值毁腿。
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
var vowels = 0, consonants = 0, others = 0
for character in string {
switch String(character).lowercaseString {
case "a", "e", "i", "o", "u":
++vowels
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
++consonants
default:
++others
}
}
return (vowels, consonants, others)
}
函數(shù)形參名
- 外部形參名
如果不添加外部形參名辑奈,本地形參名和外部形參名默認(rèn)是相同的,如果添加外部形參名已烤,則在函數(shù)外部顯示外部形參名鸠窗,內(nèi)部顯示內(nèi)部形參名。
func googbye(personname name:String) -> String {
return name
}
print(googbye(personname: "haha")) - 默認(rèn)形參值
默認(rèn)形參值胯究,默認(rèn)放置在函數(shù)參數(shù)列表的末尾
func join(s1:String,s2:String,joiner:String = " ") -> String {
return s1+joiner+s2
}
有默認(rèn)值時(shí)稍计,可以不傳入joiner的值,但是如果有需要裕循,也可以傳
print(join(s1: "1", s2: "2"))
print(join(s1: "3", s2: "4", joiner: "+")) - 可變形參
一個(gè)可變形參可接受零個(gè)或多個(gè)指定類型的值臣嚣。當(dāng)函數(shù)被調(diào)用時(shí),可以使用可變形參來指定--形參可以用來傳遞任意數(shù)量的輸入值剥哑」柙颍可通過在形參的類型名后邊插入三個(gè)點(diǎn)符號(...)來編寫可變形參。
傳遞至可變形參的值在函數(shù)主體內(nèi)是以適當(dāng)類型的數(shù)組存在的株婴。例如,一個(gè)可變參數(shù)的名稱為numbers和類型為Double...在函數(shù)體內(nèi)就作為名為numbers類型為Double[]的常量數(shù)組怎虫。
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for numder in numbers {
total += numder
}
return total/Double(numbers.count)
}
print(arithmeticMean(numbers: 1,2,3,4,5,6))
// 函數(shù)最多可以有一個(gè)可變形參,而且它必須出現(xiàn)在參數(shù)列表的最后督暂,以避免使用多個(gè)形參調(diào)用函數(shù)引發(fā)歧義揪垄。
如果你的函數(shù)有一個(gè)或多個(gè)帶有默認(rèn)值的形參,并且還有可變形參逻翁,請將可變形參放在所有默認(rèn)形參之后饥努,也就是列表的最末尾。