Swift中的函數跟JAVA語言的函數差不多,但也有差别,SWIFT中定義函數可以指定參數的名稱這也是别的語言沒有的,好處就是增加了可讀性。其傳回值是放在未尾的,如以下定義一個加法器:
func add(number1 num1:Int,number2 num2:Int) -> Int{
return num1 + num2
}
調用時需寫上參數名稱,也就是參數中的第一個名稱
add(number1:1,number2:2)
當然定義函數時number1和number2寫不寫都可以,為了增加程式的可讀性建議還是寫上,當然也可以将number1跟num1設為一樣的,在參數前面加入#号即可:
func add(#number1:Int,#number2:Int) -> Int{
return number1 + number2
add(number1: 1, number2: 2)
函數參數也可以有預設值:
//Has default value function
func sayHello(userName nickName:String,greeting:String = "Hello"){
println("\(greeting),\(nickName)")
sayHello(userName: "Ken") //此時列印:Hello Ken
可變參數的函數定義,可變參數要放在參數清單的最後一位:
//changable length parameters
//changeable paramter put at the last position ...
func whoJoin(user1:String,user2:String,others:String ... ){
var users = "\(user1),\(user2)"
if !others.isEmpty{
for user in others{
users += ",\(user)"
}
}
println(users)
預設情況下在函數的參數是常量,也就是說在函數體内不可以修改參數的值,如果要修改....自代碼:
//the paramters can be changed,as default situation the parameters is const
func toBianry(var num:Int) -> String{ //将參數用var關鍵字修飾
println(num)
var result = ""
while num > 0 {
result = String(num % 2) + result
num = num / 2 //這樣就不會報錯了
return result
參數的值傳遞在參數前加入關鍵字inout:
func calculateResult(inout #battery:Int){
switch battery{
case 0..<3:
battery = 1
case 3..<6:
battery = 2
case 6..<10:
battery = 3
default:
battery = 4
var battery = 9
calculateResult(battery: &battery) //調有時系統也會提示加入&附号
println(battery) //3
無傳回值的函數可以有以下三種定義:
第一種是傳回一個關鍵字Void:
func sayHello(username:String) -> Void {
println("Hello \(username)")
因為沒有傳回值,可以直接傳回一對括号,這就是第二種:
func sayHello(username:String) -> () {
第三種就什麼也不寫,這種還是比較友善的
func sayHello(username:String){
類似于JAVASCRIPT中的函數變量,SWIFT中也有類似的功能,拿上文中的add做示範,此時變量的參數類型定義為函數的參數清單類型傳回值類型也是原函數的傳回值類型,此時就可以調用新的方法了。
var addMethod:(Int,Int) -> Int = add
addMethod(10,36)
在JAVASCRIPT中函數可以做為參數傳給一個函數,SWIFT中也可以這樣實作,開放一個函數接口供開發者傳入自定義方法。灰常強大的功能
如下定義兩個方法,具體的實作很簡單。
func addOnePoint(#num:Int) -> Int{
return num + 1
func minusOnePoint(#num:Int) ->Int{
return num - 1
//此方法的第一個參數為函數類型,調用時傳一個與之參數清單相同傳回值類型相同的函數名稱即可。
func operationNum( op:(Int) -> Int,num:Int) -> Int{
return op(num)
operationNum(addOnePoint, 10) //11
operationNum(minusOnePoint, 10) //9
以下為自定義一個方法然後調用系統的排序方法将數組從位數從小到大字元從大到小排序
函數也可以做為傳回值,如下代碼
func totalPrice(weight:Int) -> Int{
func chooseMailFeeCalcMethod(weight:Int) -> (Int) -> Int{ //定義一個傳回值為函數的函數,非常酷吧,這樣就把具體的業務邏輯抽象出來,易于代碼的維護 return weight <= 10 ? tier1MailFee : tier2MailFee
let mailFeeCalc:(Int) -> Int = chooseMailFeeCalcMethod(weight) //傳回一個具體的函數