《Swift学习笔记》09 - 函数的简单介绍

介绍:Swift 语言由苹果公司在 2014 年推出,用来撰写 Mac OS 和 iOS 应用程序,并且Swift还是开源的,开源地址:https://github.com/apple/swift,同时附上官方博客地址:https://swift.org
目前Swift已经发展到了第五版本。显然苹果大有推翻 OC “江山”的意思.
今天就来初探一下Swift,看看究竟为何swift有这么大的能力。
参考内容:
Swift中文
YungFan老师

swift
一、函数的介绍
  • 函数是一个独立的代码块,用来执行特定的任务。通过给函数一个名字来定义它的功能,并且在需要的时候,通过这个名字来“调用”函数执行它的任务。
  • 函数的格式如下:
func 函数名(参数列表) -> 返回值类型 {
    代码块
    return 返回值
}

func是关键字,多个参数列表之间可以用逗号,分隔,也可以没有参数
使用箭头->指向返回值类型
如果函数没有返回值,返回值为Void 或者可以把-> 返回值类型部分省略

二、常见的函数类型
  1. 无参无返回值函数
// 1.无参无返回值函数
func func1() -> Void{
    print("无参无返回值函数 写法一")
}

func func2(){
    print("无参无返回值函数 写法二")
}

func1()
func2()
  1. 无参有返回值函数
func func3() -> String{
    return "无参有返回值函数"
}
print(func3())
  1. 无参数多个返回值 : 通过元组实现
func func7() -> (name:String, age:Int){
    return ("annwn", 13)
}
print(func7())
  1. 有参数无返回值
  • 一个参数无返回值
func func4(person : String) -> Void{
    print("hello" , person + "!")
}
func4(person: "swift")
func4(person: "Obj-C")
  • 多参数无返回值

func func5(person : String, name : String){
    print("hello", person + "!", "我叫" + name)
}
func5(person: "swift", name: "annwn")
  1. 有参数有返回值
  • 一个参数有返回值
func func6(person : String) -> String{
    let hello = "hello " + person + "!"
    return hello
}
print(func6(person: "swift"))
  • 多参数有返回值
func func8(person: String, isEsay: Bool) -> String{
    var easy : String = String()
    if isEsay {
        easy = "简单"
    }else{
        easy = "难"
    }
    let resove = person + easy
    return resove
}

print(func8(person: "swift ", isEsay: false))
  • 多参数多返回值
func func9(person: String, isEsay: Bool) -> (String , String) {
    let person = person
    var easy = ""
    
    if !isEsay || person == "swift" {
        easy = "难"
    }else{
        easy = "简单"
    }
    
    return (person, easy)
}

print(func9(person: "swift", isEsay: true))
  1. 可选元组返回类型
  • 如果元组在函数的返回类型中有可能“没有值”,你可以用一个可选元组返回类型来说明整个元组的可能是 nil 。
  • 书法是在可选元组类型的圆括号后边添加一个问号( ?)例如 (Int, Int)? 或者 (String, Int, Bool)? 。

注意:类似 (Int, Int)?的可选元组类型和包含可选类型的元组 (Int?, Int?)是不同的。对于可选元组类型,整个元组是可选的,而不仅仅是元组里边的单个值。

func minMax(array: [Int]) -> (min: Int, max: Int)? {
    if array.isEmpty { return nil }
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1.. currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}
if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
    print("min is \(bounds.min) and max is \(bounds.max)")
}
// Prints "min is -6 and max is 109"
三、函数实际参数标签和形式参数名
  • 每一个函数的形式参数都包含实际参数标签形式参数名
  • 形式参数名用在函数的实现当中;
  • 实际参数标签用在调用函数的时候;在调用函数的时候每一个实际参数前边都要写实际参数标签

默认情况下,形式参数使用它们的形式参数名作为实际参数标签。

// 实际标签和形式参数名
func func10(形式参数名 : String , 形式参数名2 : String) {
    print(形式参数名, 形式参数名2)
}

func10(形式参数名: "函数调用的时候,实际标签为形式参数名", 形式参数名2: "默认情况下,形式参数使用它们的形式参数名作为实际参数标签")
  1. 指定实际参数标签
    在提供形式参数名之前写实际参数标签,用空格分隔:
func someFunction(argumentLabel parameterName: Int) {
    print("指定实际参数标签 \(parameterName)"  )
}
someFunction(argumentLabel: 1)

注意:如果你为一个形式参数提供了实际参数标签,那么这个实际参数就必须在调用函数的时候使用标签。

实际参数标签的使用能够让函数的调用更加明确,更像是自然语句,同时还能提供更可读的函数体并更清晰地表达你的意图。

  1. 默认形式参数值

如果函数没有传入参数值,可以给形式参数设置一个默认的参数值。
如果定义了默认值,你就可以在调用函数时候省略这个形式参数。

func fristFunction(defaultNumber: Int = 10){
    print(defaultNumber)
}

fristFunction(defaultNumber: 12) // 12
fristFunction() // 10

通常情况下,我们把不带有默认参数的形式参数放到前面,这样方便观察和使用。

  1. 可变形式参数
    Swift中函数的参数个数可以变化,可接受不确定数量的参数
    参数必须具有相同的类型
    可以通过在参数类型名后面加入... 的方式来指示可变参数
func totalFunction(numbers:Int...) -> Int{
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
totalFunction() // 0
totalFunction(numbers: 10) // 10
totalFunction(numbers: 10, 20, 30) // 60

注意:一个函数最多只能有一个可变形式参数。

  1. 输入输出形式参数
  • 如果你想函数能够修改一个形式参数的值,而且你想这些改变在函数结束之后依然生效,那么就需要将形式参数定义为输入输出形式参数。
  • 在形式参数定义开始的时候在前边添加一个 inout关键字可以定义一个输入输出形式参数。输入输出形式参数有一个能输入给函数的值,函数能对其进行修改,还能输出到函数外边替换原来的值。
  • 你只能把变量作为输入输出形式参数的实际参数。你不能用常量或者字面量作为实际参数,因为常量和字面量不能修改。在将变量作为实际参数传递给输入输出形式参数的时候,直接在它前边添加一个和符号 ( &) 来明确可以被函数修改。
    注意:输入输出形式参数不能有默认值,可变形式参数不能标记为 inout,如果你给一个形式参数标记了 inout,那么它们也不能标记 var和 let了。
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// prints "someInt is now 107, and anotherInt is now 3"

上边的栗子显示了 someInt 和 anotherInt的原始值即使是在函数的外部定义的,也可被函数 swapTwoInts(::)修改。

  • 输入输出形式参数与函数的返回值不同。上边的 swapTwoInts没有定义返回类型和返回值,但它仍然能修改 someInt和 anotherInt的值。输入输出形式参数是函数能影响到函数范围外的另一种替代方式。
四、函数类型
    • 函数类型的概念
    • 函数是引用类型
    • 每一个函数都有一个特定的函数类型,它由形式参数类型返回类型组成。
    • 有了函数类型以后,就可以把函数类型像Int、Double、Array来用

下面的例子中定义了两个函数:addTwoInts 和 multiplyTwoInts,这两个函数都传入两个 Int 类型参数,返回一个Int类型值,因此这两个函数的类型是(Int, Int) -> Int,也读作:“有两个形式参数的函数类型,它们都是 Int类型,并且返回一个 Int类型的值。”

// 定义两个函数
func addTwoInts(a : Int, b : Int) -> Int {
    return a + b
}

func multiplyTwoInt(a : Int, b : Int) -> Int {
    return a * b
}
  1. 使用函数类型
  • 定义函数的类型
// 定义函数的类型
var mathFunction : (Int, Int) -> Int = addTwoInts

这可以读作:
“定义一个叫做 mathFunction的变量,它的类型是‘一个能接受两个 Int值的函数,并返回一个 Int值。’将这个新的变量指向 addTwoInts函数。”

  • 使用函数的名称
// 使用函数的名称
mathFunction(10, 20)
  • 给函数类型变量赋值其他值
// 给函数类型变量赋值其他值
mathFunction = multiplyTwoInt

// 使用函数的名称
mathFunction(10, 20)

不同的函数如果有相同的匹配的类型的话,就可以指定相同的变量,和非函数的类型一样

  • 和其他的类型一样,当你指定一个函数为常量或者变量的时候,可以将它留给 Swift 来对类型进行推断:
let anotherMathFunction = addTwoInts
// anotherMathFunction is inferred to be of type (Int, Int) -> Int
  1. 函数类型作为形式参数类型
    可以将函数类型当作普通的类型添加到函数命名里面去使用
func printMathFunction(_ mathFunction: (Int, Int) -> Int,_ a : Int, _ b : Int) {
    print(mathFunction(a, b))
}
printMathFunction(mathFunction, 3, 2) // 6
  1. 函数类型当作返回值去使用
  • 你可以利用函数的类型作为另一个函数的返回类型。写法是在函数的返回箭头( ->)后立即写一个完整的函数类型。
//定义两个函数
func addTwoInts(a : Int, b : Int) -> Int {
    return a + b
}

func multiplyTwoInt(a : Int, b : Int) -> Int {
    return a * b
}

//函数作为返回值
func getResult(a:Int) -> (Int, Int)->Int{
    if a > 10 {
        return addTwoInts
    }
    else{
        return multiplyTwoInt
    }
}
//调用返回的函数
getResult(a: 2)(10,20)
getResult(a: 12)(10,20)
五、函数的嵌套
  • 内嵌函数顾名思义就是在可以在函数的内部嵌套函数,相对于OC来说更加的出色。
  • 内嵌函数在默认情况下在外部是被隐藏起来的,但却仍然可以通过包裹它们的函数来调用它们。包裹的函数也可以返回它内部的一个内嵌函数来在另外的范围里使用。
// 5.内嵌函数
func funcOne(int : Int , int2 : Int) -> Int{
    
    func inFunc(int : Int, int2 : Int) -> Int{
        return int2 + int
    }
    
    let sum = inFunc(int: int, int2: int2)
    
    return sum
}

print(funcOne(int: 1, int2: 2)) // 3

//inFunc() // 报错

函数的介绍就到这里了。有什么不足的地方欢迎补充。文章大多数内容来自:

Swift中文
YungFan老师
再次感谢!

求职广告:本人实习生,现在急需一份工作,杭州南京合肥的都可以。对我感兴趣的可以私聊我 0.0。谢谢~~~

你可能感兴趣的:(《Swift学习笔记》09 - 函数的简单介绍)