函数

无参最简单的写法
func sayHello() {
print("say hello")
}
隐式返回
此时可以省略return 如果不仅仅只有表达式还有其他的代码就不能省略return
func sum(v1: Int,v2: Int) -> Int {
v1 + v2
}
返回元组,实现多返回值
func caclulate(v1: Int,v2: Int) -> (sum: Int,minus: Int,average: Int) {
let sum = v1 + v2
return(sum,v1 - v2,sum>>1)
}
let result = caclulate(v1: 20, v2: 10)
result.sum// 30
result.minus // 10
result.average // 15
函数的文档注释
一定要注意格式
/// 求和
///
/// 求两个参数的和
///
/// - Parameter v1:第一个参数
/// - Parameter v2:第二个参数
/// - Returns: 两个参数相加
///
/// Note 可以传递两个正整数
func sum(v1 :Int ,v2: Int) ->Int {
return v1 + v2
}
按option键就会出现如下所示:

参数标签
v1和v2就是参数标签
// 参数标签
func gotoWork(at time:String) {
print("gotowork at\(time)")
}
gotoWork(at: "09:00")
// at作为一个标签 可以起到容易理解的作用
func sum1(_ v1 :Int ,_ v2: Int) ->Int {
return v1 + v2
}
sum1(10, 20)
//_可以省略函数标签,但是一般不推荐,让别人引用起来方便易懂会更友好
默认参数值(Default parameter value)

可变参数

swift自带的print函数
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n")
//第一个参数,任何类型的可变参数
// 第二个参数,默认分隔符是空格,可以自定义分隔符
// 第三个参数,最后默认是换行符,也可以替换成别的
print("1","2","3",separator:"-",terminator:"")//1-2-3
print("1","2","3",terminator:"...")//1 2 3...
输入输出参数

由于函数的默认参数都是常量
let
,所以上述代码是会报错的,就算它是var
也不可能修改外部变量number的值,所以引进了输入输出参数inout
var number = 10
func add(_ num: inout Int) {
num = 20
}
add(&number)
print("number\(number)")//number 20
// 这样就能做到在函数内部,修改外部变量的值
注意点
:1.可变参数不能用inout修饰,(Int...这种可变参数)
2.inout参数不能有默认值
3.inout参数的本质是地址传递(引用传递)看汇编lea指令是地址传递的意思,且后面不再有mov指令
4.inout参数只能传入可以多次赋值的字面量和let都不允许,因为不可以被多次改变
var v1 = 30
var v2 = 40
// 区分系统交换方法swap
func swapvalue(_ v1: inout Int,_ v2: inout Int) {
let temp = v1
v1 = v2
v2 = temp
}
swapvalue(&v1, &v2)
print(v1,v2)// 40 30
// 使用元组来实现交换
func swapva(_ v1: inout Int,_ v2: inout Int){
(v1,v2) = (v2,v1)
}
swapvalue(&v1, &v2)
print(v1,v2)// 30 40
函数重载
1.参数个数或参数类型或参数标签名三者不同会构成函数重载

内联函数(InLine Function)
如果开启了编译器优化(release模式默认开启优化),编译器会自动将某些函数变成内联函数
如图所示:

内联函数 会将函数调用展开成函数体.
正常函数调用,涉及到申请栈空间

函数类型

1.函数类型作为返回参数

2.函数类型作为成员变量
class Preson {
var age: Int// 成员变量Int类型
var fn: () -> () // 成员变量 函数类型
}
3.函数类型作为返回值

typealias

// void的定义就是个空元组 用到了 别名
public typealias Void = ()
@inline(了解即可)

嵌套函数(Nested Function)

网友评论