Swift 中的 Functions

526 阅读3分钟

LearniOS

Swift

Functions

1、虽然(Example1)中的函数没有返回值类型,但是严格的讲,该方法(greet(person:))还是返回了一个值,即使没有定义返回值。如果函数没有定义返回值的话,它默认会返回一个类型为Void的具体值。会返回一个空的元祖(写做())。

Example1 :

func greet(person: String) {
    print("Hello, \(person)!")
}

2、返回值可以被忽略。

返回值可以被忽略,但是一个声明了返回值的函数必须有返回值。如果你声明的函数有返回值,而你的函数体内并没有返回值的话,编译器会报错。

3、(Int, Int)?(Int?, Int?)是不同的。一个可选的元祖类型,并不是意味着它包含的每个值都是可选类型。

Example2 :

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)
}

4、如果你不想每个参数都写一个参数标签,你可以使用'_'来代替参数标签(eg:Example3)。

Example3 :

func someFunction(_ firstParameterName : Int, secondParameterName: Int) {
    // _代表第一个参数
}
someFunction(1, secondParameterName: 2)

5、通过在参数类型后面给参数添加一个值,你可以定义任何参数的默认值。如果参数被设置默认值,在调用该方法的时候你可以忽略该参数(Example4)。

Example4 :

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {

}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault 为 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault 为 12

6、一个可变参数可以接受0个或者多个指定类型的参数。 你使用可变参数来指定在调用函数时,参数可以传递不同数量的输入值. 在参数类型后面添加三个点(...)来表明它为可变参数(Example5)。

  • 一个函数最多有一个可变参数。
  • 函数参数默认为常量。

Example5 :

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)
// return 3
arithmeticMean(3, 8.25, 18.75)
// returns 10.0

7、输入输出参数不能有默认值,并且可变参数不能标记为inout。你只能将变量声明为in-out参数。

8、In-out参数和函数的返回值是不一样的。下面的例子并没有定义返回值,但是它仍然能修改someInt和anotherInt的值。In-out可以影响函数体外的参数值(Example6)。

Example6 :

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 = 107 anotherInt = 3

9、函数解读

Example7 :

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

上面函数的类型为() -> Void,或者是一个没有参数,返回值为Void的函数。

Example8 :

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
var mathFunction: (Int, Int) -> Int = addTwoInts

定义一个名字为mathFunction的变量,它的类型为:有两个Int类型的参数,并且返回值为Int的函数。该变量指向addTwoInts函数。

10 函数当参数

Example9 :

func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)

11、内嵌函数

嵌套函数默认情况下从外部隐藏,但仍然可以由其封闭函数调用和使用。封闭函数还可以返回其一个嵌套函数,以允许嵌套函数在另一个作用域中使用(Example9)。

Example10 :

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 currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero 现在等同于stepForward函数,因为(currentValue > 0)为false
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")