欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《Swift 4.0 语言学习之路》第一章 语法基础篇(2)

程序员文章站 2022-04-11 17:49:58
...

1.7 函数

 

1.7.1函数定义

func 函数名(参数列表)->返回值类型{

函数体

}

其中参数列表:

[参数标签1]形式参数1:类型,[参数标签2]形式参数2:类型,........................

e.g.

func add(n1:Int,n2:Int)->{

return n1+n2

}

var n=add(n1:12,n2:13)

 

1.7.2 函数返回多个值(用元组实现)

func compare(_ numbers: [Int]) -> (min: Int, max: Int, sum: Int) {
   var min = numbers[0]
   var max = numbers[0]
   var sum = 0
   for score in numbers {
       if score > max {
           max = score
       } else if score < min {
           min = score
       }
       sum += score
   }   
   return (min, max, sum)
}
let result = compare([11,2,34,56,1])
print (result) //(min: 1, max: 56, sum: 104)

1.7.3 函数的参数标签

函数使用它们的参数名称作为它们参数的标签,在参数名称前可以自定义参数标签,或者使用 _ 表示不使用参数标签,或者省略标签,使用参数名作为标签。

func hi2(_ name: String) -> String {      //不使用标签
    return "Hello \(name)."
}
print( hi2("aven"))//Hello aven.   //hi2("aven")



func hi2(nickname name: String) -> String {   //标签nikname
    return "Hello \(name)."
}
print( hi2(nickname:"aven")) //Hello aven.  //hi2(nickname:"aven")


func hi2(name: String) -> String {      //不使用标签,无 “_” 默认函数参数名作为参数标签
    return "Hello \(name)."
}
print( hi2(name:"aven"))//Hello aven.   //hi2("aven")

1.7.4 函数参数默认值

func sayHi(name :String="world"){

print("Hi,\(name)")

}

sayHi()  // 默认参数

sayHi(name:"aab")  //aab

1.7.5 可变参数

在函数参数后面加 ... 表示该参数接受0或多个值

unc data(numbers: Int...) -> Double {
    var sum = 0
    let count = numbers.count
    for number in numbers {
        sum += number
    }
    if count == 0 {
        return 0
    }
    return Double(sum/count)
 }
 print(data(numbers: 1,2,111))//38.0
 print(data(numbers: 22,1,43,12,53))//26.0
 print(data())//0.0

1.7.6 输入输出参数

一般函数的实际参数值不会因为函数的调用而改变,如果要改变,可在参数前 加 inout 关键字

func swap(a:inout String,b:inout String){
(a,b)=(b,a)
}

var a:String ="string1",b:String = "string2"

swap(%a,%b)

1.7.7 函数类型

(int,int)->int

int->int  //当参数类型只有一个时,可省略括号

let maxfunc:(num1:Int,num2:Int)->Int=max  //参数类型中还可以指定外部参数名,此处max表示函数,maxfunc为外部参数名 调用方法

                                                                     //为:maxfunc(n1:10,n2:1)

注意:函数也可以作为另一个函数的参数,也可以当做参数传入另一个函数

func hasAnyMatches(bumber: Int, condition: (Int) -> Bool) -> Bool {
    if condition(bumber) {
        return true
    }
    return false
 }
func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        print (number)
        return 1 + number
    }
    return addOne //((Int) -> Int)
 }

1.7.8 函数嵌套。(被嵌套的函数可以访问外侧函数的变量)

unc newdata(_ number: Int) -> Int {
    var y = number;
    func add() {
       y += 5
    }
    add()
    return y
}
print(newdata(18)) //23

1.7.9函数参数的修饰符

函数内参数不能被修改,默认为let类型,想改得用inout.

func a(pp:Int){

pp= - pp

}    // 错误!!!不能修改let类型的pp

 

1.8 程序控制流

 

1.8.1条件判断

  • if 表达式

格式:

if   条件表达式 {         //这里条件表达式必须为Bool类型

语句

}

else if{

语句

}

else if{

语句

}

.....

else{        //最后为else,{  }不可省略!

语句

}

  • switch 语句

与c++不同的是执行完一条case语句以后,不会向下执行其他的case语句,每一个case语句后面必须至少有一个可执行语  句,一般会在最后加上default语句,表示当前面的case条件全部判断完后,还有其他条件就执行default后的语句。

 

格式:

《Swift 4.0 语言学习之路》第一章 语法基础篇(2)    

1.8.2循环

  • for-in 循环:
var arrData=[1,2,3]
for item in arrData{
    print("item=/(item)")  //item=1
                           //item=2
}                          //item=3


for _ in 1...5{    //不需要用到变量时,可用_代替
    print("hi")


for index in 1...3{
    print("index time 3 is\(index*2)")//index time 3 is 2
}                                     //index time 3 is 4
                                      //index time 3 is 8
  • while 循环

格式:

《Swift 4.0 语言学习之路》第一章 语法基础篇(2)

  • repeat-while循环(至少执行一次语句)

格式:

《Swift 4.0 语言学习之路》第一章 语法基础篇(2)

1.8.3 控制转移语句

break

continue

fallthrough // 继续执行switch中的下一个case语句

 

1.9闭包

闭包是一组用{}括起的自含功能语句块,可在代码中传递和使用。闭包参数的使用与函数类似,但不能提供参数默认值。

格式:

《Swift 4.0 语言学习之路》第一章 语法基础篇(2)

var max:(Int,Int)->Int={  //定义
    (num1:Int,num2:Int)->Int in

    return num1>num2?num1:num2

}


let m=max(10,2)//使用

闭包的一些省略写法


//: 参数类型及返回值由推断决定,可省略,此时表示参数部分的圆括号,也可省略
typealias MyClosure = (Int,Int) -> Int
var max2:MyClosure = { num1,num2 in
    return num1>num2 ? num1 : num2
}
let mValue2 = max2(10,2)
//: 由 $0、$1 等表示第一、第二、。。。等参数,省略参数部分以及 in 关键字
var max3:(Int,Int)->Int = {
    return $0>$1 ? $0 : $1
}
let mValue3 = max3(10,2)
//: 如果只有一个语句,则 return 可省略
var max4:(Int,Int)->Int = {
    $0>$1 ? $0 : $1
}
let mValue4 = max4(10,2)

闭包的內联(in-line)使用

/*函数functionTakesClosureAsParam的第一个参数 value 被传递作为myClosure 的参数。myClosure 的类型为(Int)->Int,这里无须指定参数名。*/
//以下为函数functionTakesClosureAsParam 定义

func functionTakesClosureAsParam(value: Int, myClosure: (Int) -> Int) -> Int {
    
/*函数内使用 myClosure 时,其参数(Int)可通过capturing value 机制获取函数外的变量值而得,或在函数内部通过某种途径得到,如本例获取函数的第一个参数而得*/
    
return myClosure(value)
}


//: functionTakesClosureAsParam 函数参数 Closure 的使用(非 inline)
let paramClosure = {(param:Int) -> Int in
    return param>0 ? param : -param
}
let v0 = functionTakesClosureAsParam(value: -2, myClosure:paramClosure)


//: functionTakesClosureAsParam 函数参数 Closure 的in-line调用:
let v1 = functionTakesClosureAsParam(value: 2, myClosure: {(value:Int) -> Int  in
    value * 3
})


//: Closure 参数可以通过 $0、$1、... 等引用。由于函数的第一个参数作为myClosure 的参数,故本例 $0 为 2
let v2 = functionTakesClosureAsParam(value: 2, myClosure: {$0 * 3})
print(v2)

//: 尾随闭包(Trailing Closure)。当 Closure 是函数的最后一个参数时,可以简写为:
let v3 = functionTakesClosureAsParam(value: 2) {$0 * 3}

1.10枚举(enum)

一般情况下枚举的各个值并不是自动从0开始的,而是特定的枚举类型,但有时需要用到特定类型(如Int、string等)的值(原始值raw value)来表示。下图的枚举的值默认从0开始(第一张图),也可以定义从其他值开始(见第二张图)。

raw values 规则:

  • 相同类型
  • 每个枚举内raw values 值必须唯一
  • 如果某个枚举成员的值没有指定,会通过前一个值自动增加赋予

 

《Swift 4.0 语言学习之路》第一章 语法基础篇(2)

 

 

 

 

《Swift 4.0 语言学习之路》第一章 语法基础篇(2)

 

 

未完待续。。。