Swift的統一的功能語法足夠靈活的,可表達任何東西,無論是不帶參數名稱的簡單的樣式函數,還是帶本地和外部參數名稱的復雜的Objective-C樣式方法。參數可為簡單函數調用提供默認值,并且可以被作為輸入/輸出參數傳遞,在函數執行完成時修改傳遞來的變量。
Swift中的每個函數都有一個類型,包括函數的參數類型和返回類型。你可以像使用Swift中其他類型一樣使用該類型,這使得它很容易將函數作為參數傳遞給其他函數,甚至從函數中返回函數類型。?函數也可以被寫入其他函數中以在函數作用于中封裝有用的功能。
定義和調用函數
當定義一個函數時,可以選擇性的定義一個或者多個名稱,類型值作為函數的輸入(稱為行參),或者定義一個函數結束后返回值的類型(稱之為返回型)。每一個函數都有一個函數名,用來描述函數的執行任務。要使用一個函數時,可使用它的名稱進行“調用”,并通過它的輸入值(稱為實參--argument)來匹配函數的參數類型。一個函數的實參(arguments)必須始終和函數形參(parameter)順序一致。
函數的形參和返回值
在swift中,函數的形參和返回值是非常具有靈活性的。可以定義任何事情,無論是一個簡單的僅有一個未命名形參的工具函數,還是那種具有豐富的參數名稱和不同的形參選項的復雜函數。
多輸入形參
函數可以有多個輸入形參,把它們寫到函數的括號內,并用逗號加以分隔。下面這個函數設置了一個半開區間的開始和結束索引,用來計算在范圍內有多少元素:
func halfOpenRangeLength(start: Int, end: Int) -> Int {
return end - start
}
print(halfOpenRangeLength(start: 1, end: 10))無形參函數
函數并沒有要求一定要定義的輸入形參。下面就是一個沒有輸入形參的函數,任何時候調用時,它總是返回相同的String消息:
func sayHelloWorld() -> String {
return "Hello, word"
}
print(sayHelloWorld())
該函數的定義還需要在函數的名稱后跟一對兒圓括號,即使它不帶任何形參。當函數被調用時,函數名稱也要跟著一對空括號。無返回值的函數
函數不需要定義一個返回類型。這里有一個版本的sayHello函數,稱為waveGoogBye,他會打印自己的值,而不是返回它:
func sayHelloWorld() -> String {
return "Hello, word"
}
sayGoodbye(personName: "Autumn")
因為它并不需要返回一個值,該函數的定義不包括返回箭頭(->)和返回類型。
提示:嚴格地說,sayGoodbye函數確實還返回一個值
即使沒有定義返回值。
沒有定義返回類型的函數返回了一個Void類型的特殊值。
這僅是一個空元組,這里邊沒有元素,可以被寫成()。當一個函數調用時他的返回值可以忽略不計:
print(sayHelloWorld())
func printAndCount(stringToPrint: String) -> Int{
print(stringToPrint)
return stringToPrint.characters.count
}
func printWithoutCounting(stringToPrint: String) {
print(printAndCount(stringToPrint: stringToPrint))
}多返回值函數
可以使用一個元祖類型作為函數的返回類型,來返回一個由多個值組成的復合返回值。
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)
}
函數形參名
- 外部形參名
如果不添加外部形參名,本地形參名和外部形參名默認是相同的,如果添加外部形參名,則在函數外部顯示外部形參名,內部顯示內部形參名。
func googbye(personname name:String) -> String {
return name
}
print(googbye(personname: "haha")) - 默認形參值
默認形參值,默認放置在函數參數列表的末尾
func join(s1:String,s2:String,joiner:String = " ") -> String {
return s1+joiner+s2
}
有默認值時,可以不傳入joiner的值,但是如果有需要,也可以傳
print(join(s1: "1", s2: "2"))
print(join(s1: "3", s2: "4", joiner: "+")) - 可變形參
一個可變形參可接受零個或多個指定類型的值。當函數被調用時,可以使用可變形參來指定--形參可以用來傳遞任意數量的輸入值。可通過在形參的類型名后邊插入三個點符號(...)來編寫可變形參。
傳遞至可變形參的值在函數主體內是以適當類型的數組存在的。例如,一個可變參數的名稱為numbers和類型為Double...在函數體內就作為名為numbers類型為Double[]的常量數組。
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))
// 函數最多可以有一個可變形參,而且它必須出現在參數列表的最后,以避免使用多個形參調用函數引發歧義。
如果你的函數有一個或多個帶有默認值的形參,并且還有可變形參,請將可變形參放在所有默認形參之后,也就是列表的最末尾。