返回值
沒(méi)有定義返回類(lèi)型的函數(shù),事實(shí)上靠益,會(huì)返回一個(gè)類(lèi)型為Void
的特殊值丧肴。
它是一個(gè)空的元組,寫(xiě)為()
胧后。
函數(shù)可以以元組的形式返回多個(gè)值芋浮。
定義返回類(lèi)型時(shí)可以命名元組成員,這樣壳快,當(dāng)元組返回時(shí)纸巷,可以通過(guò)所命名的名字訪(fǎng)問(wèn)镇草。
func minMax(array: [Int]) -> (min: Int, max: Int) {
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
let bounds = minMax([8, -6, 2, 109, 3, 71])
println("min is \(bounds.0) and max is \(bounds.1)")
println("min is \(bounds.min) and max is \(bounds.max)")
如果元組可能是空,可以使用 optional tuple瘤旨,來(lái)說(shuō)明函數(shù)的返回值可能為nil
梯啤。
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
if let bounds = minMax([8, -6, 2, 109, 3, 71]) {
println("min is \(bounds.min) and max is \(bounds.max)")
}
(注意(Int, Int)?
和(Int?, Int?)
的區(qū)別)
參數(shù)名
外部參數(shù)名
可以為函數(shù)參數(shù)提供外部參數(shù)名(相較于只能在函數(shù)體內(nèi)部使用的局部參數(shù)名)。
之后存哲,調(diào)用函數(shù)時(shí)因宇,就將參數(shù)值與外部參數(shù)名一一對(duì)應(yīng)。(當(dāng)定義了外部參數(shù)名祟偷,調(diào)用函數(shù)時(shí)就必須使用)
func someFunction(externalParameterName localParameterName: Int) {
// function body goes here, and can use localParameterName
// to refer to the argument value for that parameter
}
考慮下面的例子:使用了外部函數(shù)名的函數(shù)在調(diào)用時(shí)更具有表達(dá)力察滑。
func join(s1: String, s2: String, joiner: String) -> String {
return s1 + joiner + s2
}
join("hello", "world", ", ")
func join(string s1: String, toString s2: String, withJoiner joiner: String)
-> String {
return s1 + joiner + s2
}
join(string: "hello", toString: "world", withJoiner: ", ")
定義外部參數(shù)名時(shí),如果想重用局部參數(shù)名肩袍,可以使用#localParameterName
語(yǔ)法糖杭棵。
func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
for character in string {
if character == characterToFind {
return true
}
}
return false
}
let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")
如果函數(shù)參數(shù)有默認(rèn)值,該參數(shù)必定有一個(gè)外部參數(shù)名氛赐。
如果沒(méi)有顯示的提供魂爪,Swift 會(huì)自動(dòng)提供一個(gè)與局部參數(shù)名一樣的外部參數(shù)名。
見(jiàn)如下示例:
func join(string s1: String, toString s2: String,
withJoiner joiner: String = " ") -> String {
return s1 + joiner + s2
}
join(string: "hello", toString: "world", withJoiner: "-")
join(string: "hello", toString: "world")
func join(s1: String, s2: String, joiner: String = " ") -> String {
return s1 + joiner + s2
}
join("hello", "world", joiner: "-")
join("hello", "world")
當(dāng)函數(shù)中還有變長(zhǎng)參數(shù)時(shí)艰管,變長(zhǎng)參數(shù)始終出現(xiàn)在參數(shù)列表的末尾(變長(zhǎng)參數(shù)會(huì)被收集到一個(gè)數(shù)組中)滓侍,
亦即出現(xiàn)在所有有默認(rèn)值的參數(shù)后面,這也是為什么必須有默認(rèn)值的參數(shù)提供外部參數(shù)名(不然會(huì)產(chǎn)生二義)牲芋。
由此也可知道撩笆,一個(gè)函數(shù)最多只能有一個(gè)變長(zhǎng)參數(shù)。
變量參數(shù)
函數(shù)參數(shù)默認(rèn)都是常量(在函數(shù)體中試圖改變參數(shù)的值會(huì)引起編譯錯(cuò)誤)缸浦。
可以在定義函數(shù)時(shí)給參數(shù)添加var
前綴來(lái)定義變量參數(shù)夕冲,這會(huì)為函數(shù)提供一個(gè)可修改的參數(shù)值拷貝。
(注意裂逐,修改變量參數(shù)并不會(huì)改變?cè)瓍?shù)歹鱼,這是 In-Out 參數(shù)的功能)
func alignRight(var string: String, count: Int, pad: Character) -> String {
let amountToPad = count - countElements(string)
if amountToPad < 1 {
return string
}
let padString = String(pad)
for _ in 1...amountToPad {
string = padString + string
}
return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, 10, "-")
// paddedString is equal to "-----hello"
// originalString is still equal to "hello"
In-Out 參數(shù)
函數(shù)中對(duì) In-Out 參數(shù)的修改可以在函數(shù)調(diào)用后依舊保持。
函數(shù)調(diào)用時(shí)卜高,傳遞的參數(shù)必須是變量弥姻。
In-Out 參數(shù)與具有默認(rèn)值的參數(shù)和變長(zhǎng)參數(shù)不兼容。
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
println("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
函數(shù)類(lèi)型
函數(shù)可傳遞掺涛,可返回庭敦,可嵌套,概念與 Scala 中的函數(shù)類(lèi)似薪缆。
特殊說(shuō)明:無(wú)參數(shù)無(wú)返回類(lèi)型的函數(shù)類(lèi)型為 () -> ()
秧廉。