1. 函数定义
- 无返回值;
func add(a: Int, b: Int) {
return a + b
}
- 有返回值(使用 -> 来定义返回);
func add(a: Int, b: Int) -> Int {
return a + b
}
- 行参默认是let,不能为var;
- 隐式返回(只能在swift5.1及以上有效,只有一行代码,默认返回);
func add(a: Int, b: Int) -> Int {
a + b
}
- 返回元组:实现多值返回;
func calculation(a: Int, b: Int) -> (add: Int, sub: Int, mul: Int) {
return (a+b, a-b, a*b)
}
print(calculation(a: 3, b: 2))
// (add: 5, sub: 1, mul: 6)
2. 函数文档注释
/// 求和【慨述】
/// 将2个整数进行相加
///
/// - Parameter a: 第一个整数
/// - Parameter b: 第二个整数
/// - Returens: 两个整数的和
///
/// - Notes: 传入2个整数【批注】
///
func add(a: Int, b: Int) -> Int {
a + b
}
-
按 option + 鼠标左键,点击add
3. 参数标签
- 参数的标签可以修改;
func add(val1 a: Int, var2 b: Int) -> Int {
a + b
}
add(val1: 1, var2: 2)
- 用下划线 _ 省略参数标签;
func add(_ a: Int, _ b: Int) -> Int {
a + b
}
add(1, 2)
4. 设置参数默认值
func add(a: Int = 0, b: Int) -> Int {
a + b
}
print( add(b: 2) ) // 2
5. 可变参数
func test(_ nums: Int...) -> Int {
var sum = 0
for num in nums {
sum += num
}
return sum
}
print( test(1, 2, 3, 4) ) // 10
- 一个函数 最多只能有1个 可变参数;
-
紧跟在可变参数后面的参数,不能省略参数标签;
6. 输入输出参数
- 使用 inout 定义一个输入输出参数:可以在函数内部修改外部参数的值;
func swapV(v1: inout Int, v2: inout Int) {
(v2, v1) = (v1, v2)
}
var v1: Int = 10
var v2: Int = 20
swapV(v1: &v1, v2: &v2)
print("v1 = \(v1), v2 = \(v2)") // v1 = 20, v2 = 10
- 可变参数 不能设置为 inout;
- inout 参数不能设置 默认值;
-
inout 参数只能传入可以被多次赋值的;
- inout 参数本质是 地址传递;
7. 函数重载
函数重载的规则:
- 函数名相同;
- 参数个数不同、参数标签不同、参数类型不同;
func add(a: Int, b: Int) -> Int {
a + b
}
// 参数个数不同
func add(a: Int, b: Int, c: Int) -> Int {
a + b + c
}
// 参数类型不同
func add(a: Int, b: Double) -> Int {
a + Int(b)
}
// 参数标签不同
func add(v1: Int, _ v2: Int) -> Int {
v1 + v2
}
- 返回值类型 与函数重载无关;
8. 内联函数
- 如果开启了编译器优化(release模式下,默认开启优化),编译器会自动将某些函数编程内联函数;
-
将函数调用展开成函数体;
不会函数被自动内联:
- 函数体比较长;
- 包含递归调用;
- 包含动态派发;
- @(inline) 的使用:
- @inline(never) 定义的函数,永远不会被内联
@inline(never) func test() {
print("aaaa")
}
- 在release模式下,编译器会自动开启优化,决定哪个函数自动内联,因此在编写代码时没有必要使用 @(inline);
9. 函数类型
- 每一个函数都是有类型的,函数类型由 形式参数类型、返回值类型 组成;
func test() {} // () -> Void 或者 () -> ()
func add(a: Int, b: Int) -> Int {
a + b
} // (Int, Int) -> Int
// 定义函数类型变量
var fun:(Int, Int) -> Int = add
fun(2, 4) // 6
- 函数类型作为 函数的参数;
func add(a: Int, b: Int) -> Int {
a + b
} // (Int, Int) -> Int
func printAdd(_ add: (Int, Int) -> Int, _ a: Int, _ b: Int) {
let sum = add(a, b)
print(sum) // 30
}
printAdd(add, 10, 20)
- 函数作为 返回值;
func next(_ input: Int) -> Int {
input + 1
}
func previous(_ input: Int) -> Int {
input - 1
}
func forward(_ forword: Bool) -> (Int) -> Int {
forword ? next : previous
}
print( forward(false)(0) ) // -1
print( forward(true)(0) ) // 1
- 返回值是函数类型的函数,叫做高阶函数;
10. typealias
- typealias 用来给类型起别名;
typealias Byte = Int8
typealias Char = Character
typealias Short = Int16
typealias Long = Int64
typealias Date = (year: Int, month: Int, day:Int)
func printDate(_ date: Date) {
print(date.year)
print(date.month)
print(date.day)
}
printDate((2019, 9, 24))
- Void是空元祖() ;
public typealias Void = ()
11. 嵌套函数
- 将函数定义在函数内部;
func forward(_ forword: Bool) -> (Int) -> Int {
func next(_ input: Int) -> Int {
input + 1
}
func previous(_ input: Int) -> Int {
input - 1
}
return forword ? next : previous
}
print( forward(false)(0) ) // -1
print( forward(true)(0) ) // 1
网友评论