Swift中的函数
By admin
- 2 minutes read - 300 words对于Swift语言中的函数还是有许多与其它语言不同的地方的。如下:
1. 对于指定函数黑夜参数值的函数,在调用函数的时候,如果需要指定参数值的话,需要以“参数名:值”这种格式调用 func join(s1:String, s2: String, joinstr: String = “-“) -> String { return s1 + joinstr + s2 }
let result = join(“hello”, “world”, joinstr:”===”) //或者直接写前两个值 println(result)
2. 常量参数和变量参数(Constant and Variable Parameters)
数参数默认是常量。试图在函数体中更改参数值将会导致编译错误。这意味着你不能错误地更改参数值。
但是,有时候,如果函数中有传入参数的变量值副本将是很有用的。你可以通过指定一个或多个参数为变量参数,从而避免自己在函数中定义新的变量。变量参数不是常量,你可以在函数中把它当做新的可修改副本来使用。
通过在参数名前加关键字 var
来定义变量参数:
func sumValue(a: Int, b: Int) -> Int { a++ //错误,参数是常量,没有办法修改 return a + b }
对于上面的解决办法是在声明sumValue参数前面添加var实现 func sumVAlue(var a: Int, b: Int) -> Int {…}
3. 输入输出参数(In-Out Parameters)
变量参数,正如上面所述,仅仅能在函数体内被更改。如果你想要一个函数可以修改参数的值,并且想要在这些修改在函数调用结束后仍然存在,那么就应该把这个参数定义为输入输出参数(In-Out Parameters)。
定义一个输入输出参数时,在参数定义前加 inout
关键字。一个输入输出参数有传入函数的值,这个值被函数修改,然后被传出函数,替换原来的值。
你只能传入一个变量作为输入输出参数。你不能传入常量或者字面量(literal value),因为这些量是不能被修改的。当传入的参数作为输入输出参数时,需要在参数前加 &
符,表示这个值可以被函数修改。
注意:
输入输出参数不能有默认值,而且可变参数不能用
inout
标记。如果你用inout
标记一个参数,这个参数不能被var
或者let
标记。
下面是例子, swapTwoInts
函数,有两个分别叫做 a
和 b
的输出输出参数:
func swapTwoInts(inout a: Int, inout b: Int) { let temporaryA = a a = b b = temporaryA }
这个 swapTwoInts
函数仅仅交换 a
与 b
的值。该函数先将 a
的值存到一个暂时常量 temporaryA
中,然后将 b
的值赋给 a
,最后将 temporaryA
幅值给 b
。
4. 可变参数
可变参数(Variadic Parameters)
一个 可变参数(variadic parameter)
可以接受一个或多个值。函数调用时,你可以用可变参数来传入不确定数量的输入参数。通过在变量类型名后面加入 (...)
的方式来定义可变参数。
传入可变参数的值在函数体内当做这个类型的一个数组。例如,一个叫做 numbers
的 Double...
型可变参数,在函数体内可以当做一个叫 numbers
的 Double[]
型的数组常量。
下面的这个函数用来计算一组任意长度数字的算术平均数:
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8, 19)
// returns 10.0, which is the arithmetic mean of these three numbers
注意:
一个函数至多能有一个可变参数,而且它必须是参数表中最后的一个。这样做是为了避免函数调用时出现歧义。
如果函数有一个或多个带默认值的参数,而且还有一个可变参数,那么把可变参数放在参数表的最后。
- 函数类型/函数类型作为参数类型/函数类型作为返回类型
6. 嵌套函数
这章中你所见到的所有函数都叫全局函数(global functions),它们定义在全局域中。你也可以把函数定义在别的函数体中,称作嵌套函数(nested functions)。
默认情况下,嵌套函数是对外界不可见的,但是可以被他们封闭函数(enclosing function)来调用。一个封闭函数也可以返回它的某一个嵌套函数,使得这个函数可以在其他域中被使用。
你可以用返回嵌套函数的方式重写 chooseStepFunction
函数:
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 } var currentValue = -4 let moveNearerToZero = chooseStepFunction(currentValue > 0) // moveNearerToZero now refers to the nested stepForward() function while currentValue != 0 { println("(currentValue)… “) currentValue = moveNearerToZero(currentValue) } println(“zero!”) // -4… // -3… // -2… // -1… // zero!
对于函数的更多介绍请参考: http://numbbbbb.github.io/the-swift-programming-language-in-chinese/chapter2/06_Functions.html