1. 程式人生 > >Swift新手教程系列5-函數+selector在swift中的使用方法

Swift新手教程系列5-函數+selector在swift中的使用方法

move 入口 http event use div 程序 解決 lin

原創blog。轉載請註明出處

近期在用swift寫代碼,盡管遇到一些問題,可是代碼量確實減了不少。

swfit新手教程系列會隨著我使用swfit中的積累,不斷地去修正更新

之前的教程

swift單例模式具體解釋-線程安全,多核性能

swift新手教程4-集合(Array,Dictionary)

swift新手教程3-字符串String

swift新手教程2-運算符

swift新手教程1-準備知識

在swift中,函數有keywordfunc聲明
格式
func 函數名(參數1,參數2,...)->返回值{

}

func firstFunction()->Int{
	var result = 4
	return 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()//輸出10
hwcPrint(toPrint:11)//輸出11
這裏,我們不難看出,在調用的時候swift自己主動為我們生成了一個外部參數的名稱
這是swift的一個特點:默認參數生成一個外部參數名稱

能夠使用下劃線作為默認參數的外幣名稱,這樣swfit不會提供外部參數名稱。但不建議這麽做


變量參數
在swift中,函數傳入的參數本身是常量。在函數中不能改變。假設想要讓該參數作為可改動的副本。則添
加var
註意:一個函數最多僅僅能有一個可變參數,且必須為最後一個,為了降低內容歧義

比如:
func hwcPrint(toPrint:Int){
	toPrint = toPrint+1//Wrong
	println(toPrint)
}
func hwcPrint(var toPrint:Int){
	toPrint = toPrint+1//Right
	println(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 = 10
addOne(&test1)//test1 = 11
func addOne(var input:Int){
	++input
}
var test2 = 10
addOne(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
}




Swift新手教程系列5-函數+selector在swift中的使用方法