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..<array.count] { if value < currentMin { currentMin = value } else if value > 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!")