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) -> () {
println("Hello \(username)")
}
第三种就什么也不写,这种还是比较方便的
func sayHello(username:String){
println("Hello \(username)")
}
类似于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
以下为自定义一个方法然后调用系统的排序方法将数组从位数从小到大字符从大到小排序
var nickNames = ["a","b","c","ab","ad","ac","abcd","dbca","cba","abc","cab"] sorted(nickNames) func mySortFunction(a:String,b:String) -> Bool{ return countElements(a) == countElements(b) ? a > b : countElements(a) < countElements(b) } sorted(nickNames, mySortFunction)//"c", "b", "a", "ad", "ac", "ab", "cba", "cab", "abc", "dbca", "abcd"]
函数也可以做为返回值,如下代码
func tier1MailFee( weight:Int) -> Int{ return 1 * weight } func tier2MailFee(weight:Int) -> Int{ return 2 * weight } func chooseMailFeeCalcMethod(weight:Int) -> (Int) -> Int{ //定义一个返回值为函数的函数,非常酷吧,这样就把具体的业务逻辑抽象出来,易于代码的维护 return weight <= 10 ? tier1MailFee : tier2MailFee } func totalPrice(weight:Int) -> Int{ let mailFeeCalc:(Int) -> Int = chooseMailFeeCalcMethod(weight) //返回一个具体的函数 return mailFeeCalc(weight) } totalPrice(19) //return 38
//SWIFT中函数体内也可以嵌套函数,列如某个函数不想暴露出来时,修改一下上面的代码。
func totalPrice(weight:Int) -> Int{
func chooseMailFeeCalcMethod(weight:Int) -> (Int) -> Int{ //定义一个返回值为函数的函数,非常酷吧,这样就把具体的业务逻辑抽象出来,易于代码的维护 return weight <= 10 ? tier1MailFee : tier2MailFee
}
let mailFeeCalc:(Int) -> Int = chooseMailFeeCalcMethod(weight) //返回一个具体的函数
return mailFeeCalc(weight)
}