Swift里的函数

目录

函数的定义与调用

函数参数与返回值

无参数函数

多参数函数

无返回值函数

多重返回值函数

可选元组返回类型

隐式返回的函数

函数的定义格式

函数参数标签和参数名称

函数参数

指定参数标签

忽略参数标签

默认参数值

可变参数

输入输出参数  inout

函数类型

使用函数类型

函数类型作为参数类型

函数类型作为返回类型

定义返回值为函数的函数

使用返回值为函数的函数

嵌套函数


函数的定义与调用

函数参数与返回值

无参数函数

多参数函数

无返回值函数

多重返回值函数

可以用元组(tuple)类型让多个值作为一个复合值从函数中返回。

可选元组返回类型

隐式返回的函数

任何一个可以被写成一行 return 语句的函数都可以忽略 return

一个属性的 getter 也可以使用隐式返回的形式。

函数的定义格式

func 方法名( 参数标签(可省略) 参数名称: 参数类型, ....) -> 返回值类型 {

}

func greet(person: String) -> String {
    let greeting = "Hello, " + person + "!"
    return greeting
}

函数参数标签和参数名称

每个函数参数都有一个参数标签(argument label 也有被翻译为外部参数) 以及一个参数名称(parameter name 同外部参数,参数名称也有叫内部参数,觉得这样叫可能更易于理解)。参数标签在调用函数的时候使用;调用的时候需要将函数的参数标签写在对应的参数前面。参数名称在函数的实现中使用。

完整方法定义和调用

1、
//函数定义   方法名(参数标签 参数:参数类型 …) -> 返回值 (此处为多重返回,返回一个元组 tuple)
func functionText(argumentLableA funcParameterA:String, argumentLableB funcPrameterB:Int) -> (doubleStr:String ,sumInt:Int) {
    return (funcParameterA + funcParameterA , funcPrameterB + funcPrameterB)
}

//函数调用                方法名(参数标签: 参数 ……)
let bundleTuple = functionText(argumentLableA: "ABC", argumentLableB: 123)
print("bundleTuple -> tring is:\(bundleTuple.doubleStr) , sum is :\(bundleTuple.sumInt)")

默认情况下,函数参数使用参数名称来作为它们的参数标签。

func someFunction(firstParameterName: Int, secondParameterName: Int) {
#在函数体内,firstParameterName 和 secondParameterName 代表参数中的第一个和第二个参数值
}

someFunction(firstParameterName: 1, secondParameterName: 2)
#在函数调用,firstParameterName 和 secondParameterName 代表参数中的第一个和第二个 参数标签

所有的参数都必须有一个独一无二的名字。虽然多个参数拥有同样的参数标签是可能的,但是一个唯一的函数标签能够使你的代码更具可读性。

2、
// 可以定义两个相同的参数标签
func funcationSameLable(funcLabel parameterA:String, functLabe parameterB:Int) -> String {
    return parameterA + String(parameterB)
}
print(funcationSameLable(funcLabel: "123", functLabe: 123))

函数参数

指定参数标签

 可以在参数名称前指定它的参数标签,中间以空格分隔:

func someFunction(argumentLabel parameterName: Int) {
    // 在函数体内,parameterName 代表参数值
}

忽略参数标签

如果你不希望为某个参数添加一个标签,可以使用一个下划线(_)来代替一个明确的参数标签。

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
     // 在函数体内,firstParameterName 和 secondParameterName 代表参数中的第一个和第二个参数值
}
someFunction(1, secondParameterName: 2)

默认参数值

可以在函数体中通过给参数赋值来为任意一个参数定义默认值(Deafult Value)。当默认值被定义后,调用这个函数时可以忽略这个参数。

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
    // 如果你在调用时候不传第二个参数,parameterWithDefault 会值为 12 传入到函数体中。
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault = 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault = 12

可变参数

通过在变量类型名后面加入(...)的方式来定义可变参数。可变参数的传入值在函数体中变为此类型的一个数组。

//算术平均数 

func arithmeticMean(_ numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// 返回 3.0, 是这 5 个数的平均数。
arithmeticMean(3, 8.25, 18.75)
// 返回 10.0, 是这 3 个数的平均数。

一个函数最多只能拥有一个可变参数。

输入输出参数  inout

试图在函数体中更改参数值将会导致编译错误。这意味着你不能错误地更改参数值。如果你想要一个函数可以修改参数的值,并且想要在这些修改在函数调用结束后仍然存在,那么就应该把这个参数定义为输入输出参数(In-Out Parameters)。 类似于C语言里的指针参数,实际传入的是指针的地址

只能传递变量给输入输出参数。你不能传入常量或者字面量,因为这些量是不能被修改的。当传入的参数作为输入输出参数时,需要在参数名前加 & 符,表示这个值可以被函数修改。

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)")
// 打印“someInt is now 107, and anotherInt is now 3”

函数类型

每个函数都有种特定的函数类型,函数的类型由函数的参数类型和返回类型组成。

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
    return a * b
}

这个例子中定义了两个简单的数学函数:addTwoInts 和 multiplyTwoInts。这两个函数都接受两个 Int 值, 返回一个 Int 值。

这两个函数的类型是 (Int, Int) -> Int

可以解读为: “这个函数类型有两个 Int 型的参数并返回一个 Int 型的值”

func printHelloWorld() {
    print("hello, world")
}

这个函数的类型是:() -> Void,或者叫“没有参数,并返回 Void 类型的函数”。

使用函数类型

在 Swift 中,使用函数类型就像使用其他类型一样。

var mathFunction: (Int, Int) -> Int = addTwoInts

“定义一个叫做 mathFunction 的变量,类型是‘一个有两个 Int 型的参数并返回一个 Int 型的值的函数’,并让这个新变量指向 addTwoInts 函数”

print("Result: \(mathFunction(2, 3))")
// Prints "Result: 5"
mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 6"

像其他类型一样,当赋值一个函数给常量或变量时,你可以让 Swift 来推断其函数类型:

let anotherMathFunction = addTwoInts
// anotherMathFunction 被推断为 (Int, Int) -> Int 类型

函数类型作为参数类型

如上面的函数一样,同样是输出某种数学运算结果:

func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// 打印“Result: 8”

定义了 printMathResult(_:_:_:) 函数,它有三个参数:第一个参数叫 mathFunction,类型是 (Int, Int) -> Int,你可以传入任何这种类型的函数;第二个和第三个参数叫 a 和 b,它们的类型都是 Int,这两个值作为已给出的函数的输入值

函数类型作为返回类型

可以用函数类型作为另一个函数的返回类型。你需要做的是在返回箭头(->)后写一个完整的函数类型。

定义返回值为函数的函数

func setForward(_ input: Int) -> Int {
    return input + 1
}

func setBackward(_ input: Int) -> Int {
    return input - 1
}

//名为 chooseSetFunction(isBackward:) 的函数,它的返回类型是 (Int) -> Int 类型的函数。
func chooseSetFunction(isBackward: Bool) -> (Int) -> Int{
    return isBackward ? setBackward : setForward
}

使用返回值为函数的函数

现在可以用 chooseSetFunction(backward:) 来获得两个函数其中的一个:

var currentValue = 3
let moveNearerToZero = chooseSetFunction(isBackward: currentValue > 0)
// moveNearerToZero 现在指向 steBackward() 函数。

以上把返回值为函数的函数定义为一个常量

使用

while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")


输出
3... 
2... 
1... 
zero!

嵌套函数

到目前为止本章中你所见到的所有函数都叫全局函数(global functions),它们定义在全局域中。你也可以把函数定义在别的函数体中,称作 嵌套函数(nested functions)

默认情况下,嵌套函数是对外界不可见的,但是可以被它们的外围函数(enclosing function)调用。一个外围函数也可以返回它的某一个嵌套函数,使得这个函数可以在其他域中被使用。

 嵌套函数 chooseSetFunction(backward:) 如下:

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backward ? stepBackward : stepForward
}
var currentNum = -4
let moveToZero = chooseStepFunction(backward: currentNum > 0)


while currentNum != 0 {
    print("\(currentNum)... ")
    currentNum = moveToZero(currentNum)
}
print("zero!")

打印
// -4...
// -3...
// -2...
// -1...
// zero!

示例代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值