//: Playground - noun: a place where people can play
import UIKit
//函数:用来完成特定任务的代码块
/*
函数声明: 告诉编译器函数的名字,返回类型及参数
函数定义: 提供了函数的实体
func(关键字) 函数名称 (参数名:参数类型,参数名:参数类型..)->函数返回值类型{函数实现部分}
*/
//无参返回值
funcsay(){
print("hello")
}
say()
//有参数无返回值
funcsayWithName(name:String,age:Int){
print("say is\(name)")
}
sayWithName(name:"Tom",age:18)
//有参数有返回值类型
funcinfoShow(name:String,age:Int)->String{
return ("My name is\(name)")
}
letb =infoShow(name:"Tina", age:10)
print(b)
//嵌套函数
funcshowArray(array:[Int]){
fornuminarray {
print(num)
}
leta = array.count
ifa>0{
print("数组有值")
}
// func add(a:Int,b:Int)->Int{
// return a + b
// }
// return add(a: 7, b: 8)
}
showArray(array: [2,3,4,5])
//默认情况下的参数都是内部参数,不能外部使用,外部参数只能外部使用,函数内部不能使用
//函数参数
funcjoinStr(s1:String,s2:String,value s3:String="name")->String{
returns1+s2+s3
}
joinStr(s1:"1", s2:"2")
joinStr(s1:"1", s2:"2", value:"3")
//注意:如果参数有默认值,需要修改需加上外部参数名
//默认情况下,swift中所有参数都是常量参数,如需要修改需修改变量在函数内重新赋值
funcswapValue(a:Int,b:Int){
vara = a
varb = b
print("交换前a =\(a) b =\(b)")
lettemp = a
a = b
b = temp
print("交换后a =\(a) b =\(b)")
}
swapValue(a:3,b:4)
//如果想在函数中修改外界传入的参数,可以在参数的数据类型添加关键字inout,这时候传递的是参数本身而不是参数的值
varx1 =10
varx2 =20
funcswap3(ax:inoutInt,bx:inoutInt){
lettemp = ax
ax = bx
bx = temp
print("交换后a =\(x1) b =\(x2)")
}
print("交换前a =\(x1) b =\(x2)")
swap3(ax: &x1, bx: &x2)
/*
inout 关键字补充 swift有两种参数传递方式
1、值传递
值传递是参数的一个副本,这样在调用参数的过程中不会影响原始数据
2、指针传递
指针传递把参数本身引用(内存地址)传递过去,在调用的过程会影响原始数据
说明上面inout是什么传递? 指针传递
在swift中,只有class是指针传递,其余的比如Int、Float、Bool等都是值传递
有时候我们需要通过一个函数改变函数外面变量的值(将一个值类型参数以引用方式传递),这时,Swift提供的inout关键字就可以实现
注意 inout修饰的参数是不能有默认值的,
一个参数一旦被inout修饰,就不能再用var 或者 let修饰
*/
varvalue =50
funcincrement(value:inoutInt, length:Int) {
value += length
}
increment(value: &value, length: 20)//系统默认添加了一个&地址符号,说明可以修改原地址数据
print(value)
//如果有多个参数可以使用集合
funcadd(other:Int,nums:Int...)->Int{
varsum =0
fornuminnums{
sum += num
}
returnsum
}
add(other:2, nums:1,2,3,4)
//函数实际上是一种特殊的闭包,你可以使用{}来创建一个匿名闭包。使用in将参数和返回值类型声明与闭包函数体进行分离。
varnumbers = [1,3,4,2,5]
numbers.map({
(number:Int)->Intin
letresult =3* number
returnresult
})
//你可以通过参数位置而不是参数名字来引用参数——这个方法在非常短的闭包中非常有用。当一个闭包作为最后一个参数传给一个函数的时候,它可以直接跟在括号后面。
print("特殊闭包==",numbers.map({ numberin3* number }))
//map怎么使用
letmapnumbers = [1,2,3,4]
letresult =mapnumbers.map{ $0 +2}
print(result) // [3,4,5,6]
//map 方法接受一个闭包作为参数, 然后它会遍历整个 numbers 数组,并对数组中每一个元素执行闭包中定义的操作。 相当于对数组中的所有元素做了一个映射。 比如咱们这个例子里面的闭包是讲所有元素都加 2 。 这样它产生的结果数据就是 [3,4,5,6]
/*
------------------------------函数类型:
类似于C语言的指向函数的指针
类似于OC语言的block
函数类型是由函数的参数类型和返回值类型组成的
*/
//可以利用函数类型定义函数变量和常量
funcsum(a:Int,b:Int)->Int{
returna + b
}
funcsub(a:Int,b:Int,c:Int)->Int{
returna - b
}
// 这两个函数的类型是 (Int, Int) -> Int
// 函数类型可以作为函数返回值
funcmax(a:Int, b:Int) ->Int
{
returna > b ? a : b
}
funcsub(a:Int, b:Int) ->Int
{
returna - b;
}
// 可以利用函数类型定义函数变量和常量
varfuncP:(Int,Int) ->Int=sum
funcP = sub
print(funcP(10,20))
//练习 page130
//1、2 4 //2、为什么下面代码不编译 4没有逗号//3、3
//如果statuscode是个有5个元素的元祖,什么方式去获取到第五个值 1