Swift入门教程系列5-函数+selector在swift中的用法

来源:互联网 发布:openwrt php 编辑:程序博客网 时间:2024/05/04 09:18
原创blog,转载请注明出处

最近在用swift写代码,虽然遇到一些问题,但是代码量确实减了不少。

swfit入门教程系列会随着我使用swfit中的积累,不断地去修正更新

之前的教程

swift单例模式详解-线程安全,多核性能

swift入门教程4-集合(Array,Dictionary)

swift入门教程3-字符串String

swift入门教程2-运算符

swift入门教程1-准备知识

在swift中,函数有关键字func声明
格式
func 函数名(参数1,参数2,...)->返回值{

}

func firstFunction()->Int{var result = 4return result}println(firstFunction())//调用
参数为空,返回值为Int

在Swift中,函数可以有任意类型的参数,因为Swift定义函数本身是一种类型,所以函数本身也可以返回
函数,或者一个函数作为另一个函数的参数
一、常见的使用函数方式
1、无参数,返回值为空
没有返回值的时候->可以省略
func hwcFunction(){println("Hello hwc")}

2、多个参数,返回值唯一
func hwcFunction(first:String,second:String)->String{return first+second}println(hwcFunction("hello","hwc"))

3、多个参数,多个返回值
在Swift中,多个返回值常用元组来返回
func hwcSwapString(first:String,second:String)->(String,String){return (second,first)}var (second,first) = hwcSwapString("first","second")


二、外部参数
从上面的例子中,我们发现,使用的时候我们并没有看到参数的信息,就是我们并不知道第一个参数是什
么意思,第二个参数是什么意思。外部参数可以完美解决这个问题
我们来举个例子
func addPersonalInformation(Name:String,Sex:String)->String{return Name+":"+Sex}addPersonalInformation("WenchenHuang","Male")

比如输入WenchenHuang Male则返回WenchenHuang:Male.
但是,由于没有提示信息,我并不知道第一个参数是代表名字,第二个参数代表性别,这时候可以用外部
参数
func addPersonalInformation(name Name:String,sex Sex:String)->String{return Name+":"+Sex}addPersonalInformation(name:"WenchenHuang",sex:"Male")

调用的时候一目了然,知道哪一个参数代表什么意思
但是这样写仍然比较麻烦,我们不得不为同一个参数提供内部和外部两个名字
Swift为我们提供了一种简写外部参数的方式
只需要在内部参数前加上前缀,内部参数在调用的时候会体现
func addPersonalInformation(#name:String,#sex:String)->String{return name+":"+sex}addPersonalInformation(name:"WenchenHuang",sex:"Male")


三、默认参数与变量参数
默认参数就是对参数有个默认值,在函数调用的时候,可以给这个参数传值,也可以不传,不传的时候使
用默认值
举个简单的例子
func hwcPrint(toPrint:Int = 10){println(toPrint)}

调用的时候
hwcPrint()//输出10hwcPrint(toPrint:11)//输出11
这里,我们不难看出,在调用的时候swift自动为我们生成了一个外部参数的名称
这是swift的一个特点:默认参数生成一个外部参数名称

可以使用下划线作为默认参数的外币名称,这样swfit不会提供外部参数名称,但不建议这么做


变量参数
在swift中,函数传入的参数本身是常量,在函数中不能改变,如果想要让该参数作为可修改的副本,则添
加var
注意:一个函数最多只能有一个可变参数,且必须为最后一个,为了减少内容歧义

例如:
func hwcPrint(toPrint:Int){toPrint = toPrint+1//Wrongprintln(toPrint)}func hwcPrint(var toPrint:Int){toPrint = toPrint+1//Rightprintln(toPrint)}

四、可变参数
所谓可变参数,就是想很多脚本语言那样,参数个数不明确,而在函数体内部,参数保存在一个数组里
可变参数用...表示
举个例子
func addMultiString(toPrint:String...)->String{var resultString:String = ""for tempString in toPrint{  resultString+=tempString}return resultString}var result1 = addMultiString("hello","world")var result2 = addMultiString("Wen","chen","Huang")

五、输入输出参数inout

这类参数传入原值得引用,函数内对传入参数的操作会改变原始值,传入引用的时候需要使用&

func addOne(inout input:Int){++input}var test1 = 10addOne(&test1)//test1 = 11func addOne(var input:Int){++input}var test2 = 10addOne(test3)//test2 = 10

六、函数类型
前面提到过,在swift中函数本身就是一个类型,类似于C语言中的函数指针
BTW:函数类型的理解对后面闭包的理解很重要
例如:上面的函数func addOne(input:Int)
函数类型就是(Int)->()
所以,我们可以像其他类型一样使用函数类型
var add:(Int,Int)->Int 声明一个入口参数是Int,Int返回值是Int的函数类型变量add

同样,函数类型也可以作为参数传递给函数
func addThree(addTwo:(Int,Int)->Int,thrid:Int)->Int{return addTwo+thrid}

函数类型也可以作为返回值
这里采用Apple官方文档里的说明:
func stepForward(input: Int) -> Int {return input + 1} func stepBackward(input: Int) -> Int {return input - 1}func chooseStepFunction(backwards: Bool) -> (Int) -> Int {return backwards ? stepBackward : stepForward}let moveNearerToZero = chooseStepFunction(currentValue > 0)


七、函数嵌套
何为函数嵌套,就是在函数里定义函数,默认嵌套的函数对外不可见,但是可在函数内部调用。
对上面函数进行重写
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {func stepForward(input: Int) -> Int {return input + 1} func stepBackward(input: Int) -> Int {return input - 1}return backwards ? stepBackward : stepForward}


八、Selector
在swift中,建议不在使用selector,因为其不是类型安全的。但是对于熟悉Objective-C的程序员同学来说,很多方法讲不能调用,对此,swift对objective-C的selector直接传入函数名
myButton.addTarget(self, action: "buttonTapped:", forControlEvents: .TouchUpInside)let timer = NSTimer(timeInterval: 1, target: self, selector: "test", userInfo: nil, repeats: false)func test{//Do something}function buttonTapped(sendr:AnyObject){//Do something}




13 1