Swift学习笔记(四)函数
2015-08-20 10:22
561 查看
定义和调用函数 参数名personName,参数类型String 返回值类型是String
函数的多返回值元组(此处的返回值声明了变量名:方便调用函数时可以使用变量名获取值)
函数的可选元组返回类型
函数的参数名:本地参数名和外部参数名
一、本地参数名:本地参数名就是定义函数名时,在参数列表中所写的参数名,它只能在函数主体内使用
二、外部参数名:帮助理解参数的目的,更好的表达参数的功能,就需要在定义时使用外部参数名,外部参数名需要卸载本地参数名之前,并使用空格将其分开
三、如果调用时使用外部参数,则在调用该函数时需要使用外部参数名
*外部参数名不能在函数主体内使用
*如果开发者想为函数的参数提供一个外部参数名,而本地参数名已经使用了一个合适的名称,这时就不需要再为该函数写相同的两次名称了,取而代之,写一次名称,并用”#”号作为名称的前缀
设置函数参数的默认参数值(调用时传值了,则使用传的值,否则使用默认值)
可变参数:使一个参数接受0个或多个指定类型的值,设定一个可变参数需要在参数类型名添加”…”
一个函数中只能有一个可变参数,且可变参数的位置必须是所有的之后
常量参数和变量参数
函数的参数默认都是let常量,如果尝试去改变参数的值就会出现编译错误
如果想要在函数主体内对参数进行修改,你可以使用变量参数,即在参数名前加”var”关键字
变量参数的作用范围是在整个函数体内
输入输出参数:
如果你想修改一个参数值,并且在函数调用之后仍然有效,这时就可以使用输入输出参数
在参数名前加”inout”关键字来定义输入输出参数
输入输出参数不能有默认值
当你使用了inout修饰时就不能再使用var或者let
调用时,必须在参数前加”&”符号
函数类型
每一个函数都有一个特定的函数类型,由参数类型和返回值类型共同决定
函数类型的使用:定义一个变量mathFunction,其是一个函数类型,指向addTwoInts函数
与其他类型一样,当你为一个常量或变量分配一个函数时,你可以把它推断函数类型
函数类型做参数类型
当函数的提供者提供的函数被调用时,会使你脱离了一个函数某些方面的具体实现
如下示例:addTwoInts,3,5做参数,当调用mathFunction(a, b),实际上会调用addTwoInts(3,5)
这就使得开发者本身不用关系addTwoInts的实现
函数类型做返回值类型
stepForward和stepBackward的函数类型都是(Int) -> Int
chooseStepFunction的返回值类型是函数类型(Int) -> Int
嵌套函数
嵌套函数默认情况下对外界是隐藏的,但是仍然可以调用和使用其内部的函数
内部函数也可以返回一个嵌套函数,允许在嵌套函数内的另一个范围内使用。
func sayHello(personName: String) -> String{ let greeting = "hello, " + personName + "!" return greeting; } println(sayHello("John")) func halfOpenRangeLength(start: Int, end: Int) -> Int { return end - start } println(halfOpenRangeLength(1, 10)) // prints "9"
函数的多返回值元组(此处的返回值声明了变量名:方便调用函数时可以使用变量名获取值)
func minMax(array: [Int]) -> (min: Int, max: Int) { 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) } let bounds = minMax([8, -6, 2, 109, 3, 71]) println("min is \(bounds.min) and max is \(bounds.max)") // prints "min is -6 and max is 109"
函数的可选元组返回类型
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) } if let bounds = minMax([8, -6, 2, 109, 3, 71]) { println("min is \(bounds.min) and max is \(bounds.max)") } // prints "min is -6 and max is 109"
函数的参数名:本地参数名和外部参数名
一、本地参数名:本地参数名就是定义函数名时,在参数列表中所写的参数名,它只能在函数主体内使用
二、外部参数名:帮助理解参数的目的,更好的表达参数的功能,就需要在定义时使用外部参数名,外部参数名需要卸载本地参数名之前,并使用空格将其分开
三、如果调用时使用外部参数,则在调用该函数时需要使用外部参数名
*外部参数名不能在函数主体内使用
*如果开发者想为函数的参数提供一个外部参数名,而本地参数名已经使用了一个合适的名称,这时就不需要再为该函数写相同的两次名称了,取而代之,写一次名称,并用”#”号作为名称的前缀
func someFunction(parameterName: Int) { //parameterName是本地参数名 //调用时不写参数名 } func someFunction(externalParameterName localParameterName: Int) { //externalParameterName是外部参数名 //localParameterName是本地参数名 //调用时需要写外部参数名 } func someFunction(#localParameterName: Int) { //#用来标识参数即是本地参数名又是外部参数名 } someFunction(2) someFunction(externalParameterName: 2) someFunction(localParameterName: 2)
设置函数参数的默认参数值(调用时传值了,则使用传的值,否则使用默认值)
func join(string s1: String, toString s2: String, withJoiner joiner: String = " ") -> String { return s1 + joiner + s2 } join(string: "hello", toString: "world", withJoiner: "-") // returns "hello-world" join(string: "hello", toString: "world") // returns "hello world"
可变参数:使一个参数接受0个或多个指定类型的值,设定一个可变参数需要在参数类型名添加”…”
一个函数中只能有一个可变参数,且可变参数的位置必须是所有的之后
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) // returns 3.0, which is the arithmetic mean of these five numbers arithmeticMean(3, 8.25, 18.75) // returns 10.0, which is the arithmetic mean of these three numbers
常量参数和变量参数
函数的参数默认都是let常量,如果尝试去改变参数的值就会出现编译错误
如果想要在函数主体内对参数进行修改,你可以使用变量参数,即在参数名前加”var”关键字
变量参数的作用范围是在整个函数体内
func alignRight(var string: String, count: Int, pad: Character) -> String { // let stringCount = count(string) let amountToPad = count - 5 if amountToPad < 1 { return string } let padString = String(pad) for _ in 1...amountToPad { string = padString + string } println(string) return string } let originalString = "hello" let paddedString = alignRight(originalString, 10, "-") // paddedString is equal to "-----hello" // originalString is still equal to "hello"
输入输出参数:
如果你想修改一个参数值,并且在函数调用之后仍然有效,这时就可以使用输入输出参数
在参数名前加”inout”关键字来定义输入输出参数
输入输出参数不能有默认值
当你使用了inout修饰时就不能再使用var或者let
调用时,必须在参数前加”&”符号
func swapTwoInts(inout #a: Int, inout #b: Int) { let temporaryA = a a = b b = temporaryA } var someInt = 3 var anotherInt = 107 swapTwoInts(a: &someInt, b: &anotherInt) println("someInt is now \(someInt), and anotherInt is now \(anotherInt)") // prints "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 } //上面两个函数的类型都是 (Int, Int) -> Int
函数类型的使用:定义一个变量mathFunction,其是一个函数类型,指向addTwoInts函数
var mathFunction: (Int, Int) -> Int = addTwoInts println("Result: \(mathFunction(2, 3))")
与其他类型一样,当你为一个常量或变量分配一个函数时,你可以把它推断函数类型
let anotherMathFunction = mathFunction
函数类型做参数类型
当函数的提供者提供的函数被调用时,会使你脱离了一个函数某些方面的具体实现
如下示例:addTwoInts,3,5做参数,当调用mathFunction(a, b),实际上会调用addTwoInts(3,5)
这就使得开发者本身不用关系addTwoInts的实现
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) { println("Result: \(mathFunction(a, b))") } printMathResult(addTwoInts, 3, 5) // prints "Result: 8"
函数类型做返回值类型
stepForward和stepBackward的函数类型都是(Int) -> Int
func stepForward(input: Int) -> Int { println(input+1) return input + 1 } func stepBackward(input: Int) -> Int { println(input-1) return input - 1 }
chooseStepFunction的返回值类型是函数类型(Int) -> Int
func chooseStepFunction(backwards: Bool) -> (Int) -> Int { return backwards ? stepBackward : stepForward } var currentValue = 3 let moveNearerToZero = chooseStepFunction(currentValue > 0) // moveNearerToZero now refers to the stepBackward() function moveNearerToZero(10) //prints "9"
嵌套函数
嵌套函数默认情况下对外界是隐藏的,但是仍然可以调用和使用其内部的函数
内部函数也可以返回一个嵌套函数,允许在嵌套函数内的另一个范围内使用。
func chooseStepFunction2(backwards: Bool) -> (Int) -> Int { func stepForward(input: Int) -> Int { return input + 1 } func stepBackward(input: Int) -> Int { return input - 1 } return backwards ? stepBackward : stepForward } var currentValue2 = -4 let moveNearerToZero2 = chooseStepFunction2(currentValue2 > 0) // moveNearerToZero now refers to the nested stepForward() function while currentValue2 != 0 { print("\(currentValue2), ") currentValue2 = moveNearerToZero2(currentValue2) } println("zero!") // -4, -3, -2, -1, zero!
相关文章推荐
- Apple Swift学习教程
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法
- Lua函数用法研究
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记