iOS swift 函数
1 函数的定义
func pi() ->Double{
return 3.14
}
func sum(v1: Int,v2:Int) ->Int {
return v1 + v2
}
sum(v1:10,v2:20)
无返回值
func sayHello () -> Void{
print("Hello")
}
func sayHello () -> (){
print("Hello")
}
func sayHello () {
print("Hello")
}
2 隐式返回
如果整个函数体是一个单一的表达式,那么函数会隐式返回这个表达式。
func sum(v1:Int,v2:Int) -> Int {
v1 +v2
}
sum(v1:10 ,v2:20)
返回元组:实现多返回值
func calculate(v1:Int,v2:Int) -> (sum: Int, difference:Int, average: Int){
let sum = v1 + v2
return (sum, v1-v2,sum >>1)
}
let result = Calulate(v1:20,v2:10)
result.sum
result.difference
result.averge
3 函数的文档注释
func sum(v1:Int,v2:Int) -> Int {
v1 + v2
}
4 参数标签 (Argument Lable)
可以修改参数标签
func goToWork(at time:String){
print("this is \(time)")
}
goToWork(at:"08:00")
可以使用下划线_ 省略参数标签
func sum(_v1: Int,_v2:Int) -> Int {
v1+v2
}
sum(10,20)
5 默认参数值(Default Parameter Value)
参数可以有默认值
func check(name:String = "nobody",age:Int, job: String = "none"){
print(“name = \(name)”,age=\(age),job=\(job)")
}
C++的默认参数值有个限制:必须从右往左设置。由于swift拥有参数标签,因此并没有此类限制。
但是在省略参数标签时,需要特别注意,避免出错。
//这里的middle不可以省略参数标签
func test(_ first: Int = 10,middle:Int ,_ last: Int = 30){
}
test(middle:20)
6 可变参数(Variadic Parameter)
func sum(_ numbers: Int)-> Int{
var total = 0
for number in numbers {
total += number
}
return total
}
sum(10,20,30,40)
一个函数最多只能有1个可变参数。
swift 自带的print 函数
print(1,2,3,4,5)
7 输入输出参数(In-Out Parameter)
可以用inout定义一个输入输出参数: 可以在函数内部修改外部实参的值。
func swapValues(_ v1:inout Int,_v2:inout Int){
let tmp = v1
v1=v2
v2= tmp
}
var num1 = 10
var num2 = 20
swapValues(&10,&20)
func swapValues(_v1: inout Int, _v2: inout Int){
(v1,v2) = (v2,v1)
}
(1) 可变参数不能标记inout
(2)inout参数不能有默认值
(3)inout 参数只能传入可以被多次赋值
(4)inout 参数的本质是地址传递 (引用传递)
8 函数重载 (function Overload)
规则:
函数名相同
1 参数个数不同//2 参数类型不同//3 参数标签不同
1 func sum(v1: Int,v2:Int) -> Int {
v1+ v2
}
2 func sum (v1:Int,v2: Int,v3:Int) -> Int {
v1+v2+v3
}//参数个数不同
func sum(v1:Int,v2:Double) -> Double {
Double (v1) +v2
}//参数类型不同
func sum(_v1:Int ,_v2:Int)-> Int {
v1 + v2
}//参数标签不同
9 函数重载注意点
(1)返回值类型与函数重载无关
func sum(v1:Int,v2:Int)-> Int{v1 + v2}
func sum(v1:Int, v2:Int){}
(2) 默认参数值和函数重载一起使用产生二义性时,编译器并不会报错(在C++中会报错)
func sum(v1:Int ,v2:Int) ->Int{
v1 + v2
}
func sum(v1:Int ,v2:Int,v3:Int = 10) ->Int{
v1 + v2 + v3
}
sum(v1:10,v2:20)
可变参数 省略参数标签 函数重载一起使用产生二义性时,编译器有可能会报错。
func sum(v1: Int , v2: Int) -> Int{}
func sum(_ v1:Int ,_ v2:Int) ->Int{
v1 + v2
}
func sum(_ numbers: Int...) -> Int{
var total = 0
for number in numbers{
total += number
}
return total }
sum(10,20)
10 内联函数 (Inline function)
如果开启了编译器优化(release模式默认会开启优化),编译器会自动将某些函数变为内联函数。
将函数调用展开成函数体。
BuildSetting -> optimization -> Optimize for Speed[-O]
拿些函数不会被自动内联。
函数体比较长/包含递归调用/包含动态派发
11 @inline
在release模式下,编译器已经开启优化,会自动决定哪些函数需要内联,因此没有必要使用@inline
12 函数类型 (Function Type)
每一个函数都是有类型的,函数类型由形式参数类型,返回值类型。
函数类型作为函数返回值
返回值时函数类型的函数,叫做高阶函数
13 typealias(别名)
typealias用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰.使用的语法也很简单。
14 嵌套函数
将函数定义在函数内部。
代码:
func forward(_ forward:Bool)-> (Int) -> Int{
func next (_ input:Int ) ->Int{
input +1
}
func previous(_ input:Int) ->Int {
input -1
}
return forward ? next : previous
}
forward(true)(3)//4
forward(false)(3)//2