函數(shù)的定義
//sayHello函數(shù)名, personName為參數(shù), -> 表示返回值
func sayHello(personName: String) -> String {
let greeting = "Hello, " + personName + "! "
return greeting
}
1.多個參數(shù)
func halfOpenRangeLength(start: Int, end: Int) -> Int {
return end - start
}
print(halfOpenRangeLength(start: 1, end: 10))
2.無參函數(shù)
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
// prints "hello, world"
盡管這個函數(shù)沒有參數(shù)齐邦,但是定義的時候椎侠,函數(shù)名后面還是需要一對圓括號。無參函數(shù)被調用時措拇,在函數(shù)名后面也需要一對圓括號我纪。
3.無返回值函數(shù)
func sayGoodbye(personName: String) {
print("Goodbye, \(personName)! ")
}
sayGoodbye("Dave")
// prints "Goodbye, Dave! "
如果函數(shù)沒有返回值,函數(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", "e", "i", "o", "u":
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)
}
let total = count(string: "some arbitrary string! ")
print("\(total.vowels) vowels and \(total.consonants) consonants")
使用元組(tuple)類型組合多個值為一個復合值作為函數(shù)的返回值浅悉。
參數(shù)默認值
func append(string: String = "-") -> String {
return string + "abc"
}
append() //-abc ,參數(shù)沒有賦值, 則使用默認參數(shù)
append(string: "qq") //qqabc //參數(shù)賦值, 則使用賦值的參數(shù)
可變參數(shù)
func countStr(nums:Double...) ->Double {
var result = 0.0
for num in nums {
result += num
}
return result
}
countStr(nums: 1, 2, 3)
注意:一個函數(shù)最多只能由一個可變參數(shù),它必須是參數(shù)列表的最后的一個券犁。這樣做是為了避免函數(shù)調用時出現(xiàn)歧義术健。
常量和變量參數(shù)#
func aliginRight(var string: String) {
//在swift3.0中, 測試發(fā)現(xiàn)錯誤, 3.0中已經取消了這種寫法, 不能這樣定義變量參數(shù)
//error: parameters may not have the 'var' specifier
//func aliginRight(var string: String) {
^~~
}
輸入輸出參數(shù)
簡單來說, 就是在函數(shù)體內, 通過修改傳入的參數(shù)的值, 達到修改函數(shù)外部變量的效果
//定義一個方法, 用于交換傳入的兩個參數(shù)的值
//使用inout關鍵字
func modify(s1: inout String) {
s1 = "modify"
}
var string = "string"
modify(s1: &string)
print(string) //"modify"
通過在參數(shù)前加 inout 關鍵字定義一個輸入輸出參數(shù)。輸入輸出參數(shù)值被傳入函數(shù)粘衬,被函數(shù)修改苛坚,然后再被傳出函數(shù)比被,原來的值將被替換。
只能傳入一個變量作為輸入輸出參數(shù)泼舱。不能傳入常量或者字面量(literal value),因為這些值是不允許被修改的枷莉。當傳入的實參作為輸入輸出參數(shù)時娇昙,需要在實參前加 & 符,表示這個值可以被函數(shù)修改笤妙。
從上面這個例子冒掌,可以看到 string原始值在 modify 函數(shù)中已經被修改了,盡管它們定義在函數(shù)體外蹲盘。
注意:輸入輸出參數(shù)和返回值是不一樣的股毫。函數(shù) modify 沒有定義返回值,卻修改了 string值召衔。輸入輸出參數(shù)是函數(shù)對函數(shù)體外產生影響的另一種方式铃诬。
使用函數(shù)類型
func one(a: Int, b: Int) ->Int {
return a + b
}
//把一個函數(shù)賦值給一個變量
var mathFunction: (Int, Int) -> Int = one
//如果是直接使用函數(shù)名調用, 需要形參
one(a: 1, b: 3)
//如果使用賦值的函數(shù)變量, 則不需要形參
mathFunction(1, 2)
函數(shù)作為參數(shù)
func one(a: Int, b: Int) ->Int {
return a + b
}
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
//調用one函數(shù)
print("Result: \(mathFunction(a, b) + a + b)")
}
//把函數(shù)傳進來
printMathResult(mathFunction: one, a: 3, b: 5)
函數(shù)作為返回值
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
//該函數(shù)有一個布爾值的參數(shù)backwards和一個返回值, 返回值是一個函數(shù), (該函數(shù)有一個參數(shù)為Int類型,返回值是Int類型)
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
let moveNearerToZero = chooseStepFunction(backwards: false)
// moveNearerToZero 現(xiàn)在代表的就是 stepBackward() 函數(shù)
print(moveNearerToZero(1)) //2
嵌套函數(shù)
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backwards ? stepBackward : stepForward
}
在這章中的所有函數(shù)都是全局函數(shù)(global functions),因為它們定義在全局域中苍凛。
當然函數(shù)也可以被定義在別的函數(shù)體中趣席,稱作嵌套函數(shù)(nested functions)。
默認情況下醇蝴,嵌套函數(shù)是對外是不可見的宣肚,但可以被封閉他們的函數(shù)(enclosing function)調用。封閉函數(shù)可以返回它的一個嵌套函數(shù)悠栓,使這個函數(shù)在其他域中可以被使用霉涨。