Swift 函数

1、函数的定义

func test() ->Void{
    print("test")
}

func test() {
    print("test")
}
func test() ->(){
    print("test")
}
func pi() -> Double {
    return 3.14
}

2、隐式返回

func sum (v1 :Int , v2: Int) -> Int{
    return v1+v2;
}
//形参默认是let 也只能是let
func sum (v1 :Int , v2: Int) -> Int{
     v1+v2;
}

3、元组返回、实现多返回值

func calcute(v1 :Int , v2: Int) ->(sum:Int,cha:Int,avg:Double){
    return (v1+v2,v1-v2,Double((v1+v2))/2.0)
}

print(calcute(v1: 2, v2: 3))
print(calcute(v1: 2, v2: 3).sum)
print(calcute(v1: 2, v2: 3).cha)
print(calcute(v1: 2, v2: 3).avg)

4、参数标签

func gotoWork( time:Int) ->(){
    print("gotoWork:(time)点")
}
//参数标签
func gotoWork(at time:Int) ->(){
    print("gotoWork:(time)点")
}

gotoWork(at: 8)
//使用下划线省略参数标签
func sum (_ v1 :Int ,_ v2: Int) -> Int{
    return v1+v2;
}

print(sum(3, 3))

5、默认参数值

func person (name : String="nobody" , age: Int = 50 ,weight:Double) {
    print("name:(name)  age(age)  weight:(weight)")
}
person(name: "jack", age: 18, weight: 99.5)
person(weight: 33)
person(name: "tom", weight: 12)
// 输出
//name:jack  age18  weight:99.5
//name:nobody  age50  weight:33.0
//name:tom  age50  weight:12.0

6、可变参数

func sum (numbers : Int...)->(Int){
    var s = 0
    
    for i in numbers {
        s+=i
    }
    return s
}

print(sum(numbers: 1,2,3,4))  //10
// 注意 一个函数只有有一个可变参数 并且紧跟着的第一个 参数标签不能省略
func test (numbers: Int... , name:String ,_ age :Int){
    print("number:(numbers) name:(name) age:(age)")
}
test(numbers: 1,3,5, name: "jack", 20)
//输出 number:[1, 3, 5] name:jack age:20

7、Swift 自带的 print 函数

/// - Parameters:
///   - items: Zero or more items to print.
///   - separator: A string to print between each item. The default is a single
///     space (`" "`).
///   - terminator: The string to print after all items have been printed. The
///     default is a newline (`"
"`).
//public func print(_ items: Any..., separator: String = " ", terminator: String = "
")
// separator 元素分割符  terminator 结尾符号
print(1,2,3,4, separator: "--", terminator: "..")
print(8,9,10, separator: "--", terminator: "..")
//输出 1--2--3--4..8--9--10..

8、 inout

可以用inout定义一个输入输出参数:可以在函数内部修改外部实参的值

可变参数不能标记为inout

 inout参数不能有默认值

inout参数的本质是地址传递(引用传递)

inout参数只能传入可以被多次赋值的

func swapValue(v1 : inout Int,v2 : inout Int){
    let t = v1;
    v1=v2;
    v2=t;
}

var a = 10
var b = 20

swapValue(v1: &a, v2: &b)
print("a(a)==b(b)")

swap(&a, &b)
print("a(a)==b(b)")

9、函数重载

//规则  函数名相同  参数类型不同、参数标签不同
func sum (a:Int,b:Int){

}

func sum (a:Float,b:Int){
    
}

func sum (a:Int,b:Float){
    
}
func sum (a:Int,b:Int,c:Int){
    
}
//函数重载于返回值无关
//默认参数与函数重载参数冲突时
func sum (a:Int,b:Int,d:Int=20){
    
}

sum(a: 2, b: 2) //调用 func sum (a:Int,b:Int){}

//可变参数 省略参数标签、与函数重载产生二义性时 、编译器会报错 Ambiguous use of 'sum‘
func sum (_ a:Int,_ b:Int){
    
}
func sum (_ numbers:Int...){
    
}

sum(1,2)

10、函数类型

func sum(v1:Int,v2:Int) -> Int {
    v1+v2
}
//定义变量
var fun:(Int,Int)->Int = sum
//调用时不需要带参数标签
print(fun(1,33))

//函数类型作为函数参数
func sum(v1:Int,v2:Int) -> Int {
   return v1+v2
}

func difference(_ v1:Int,_ v2:Int)->Int{
 return  v1-v2
}

func calcute (_ result:(Int,Int)->Int ,v1:Int ,v2:Int){
        print(result(v1,v2))
}

calcute(sum(v1:v2:), v1: 1, v2: 9) //10
calcute(difference(_:_:), v1: 9, v2: 3) //6
//函数类型昨晚函数返回值
func prefious(_ input:Int)->Int{
    input-1
}
func next(_ input:Int)->Int{
    input+1
}

func foward(isNext:Bool)->(Int)->Int{
    isNext ? next : prefious
}

print( foward(isNext: false)(9)) //8

11、 typealias用来给类型 起别名

typealias date = (year:Int,month:Int,day:Int)
func test(d:date){
    print(d.year)
    print(d.1)
    print(d.day)
}
test(d: (1,2,3))

typealias Byte = Int8

typealias Intfn = (Int,Int)->Int

func diff(v1:Int,v2:Int) -> Int {
    v1-v2
}

let fn:Intfn=diff

print(fn(30,2)) //28
//按照swift的标准定义void就是空元组  public typealias Void = ()

12、嵌套函数 将函数定义在函数内部

func foward(isNext:Bool)->(Int)->Int{
    func prefious(_ input:Int)->Int{
        input-1
    }
    func next(_ input:Int)->Int{
        input+1
    }
  return  isNext ? next : prefious
}

print(foward(isNext: true)(11)) //12
print(foward(isNext: false)(8)) //7
原文地址:https://www.cnblogs.com/ZhangShengjie/p/11322862.html