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 * weight
} func tier2MailFee(weight:Int) -> Int{
return * weight
} func chooseMailFeeCalcMethod(weight:Int) -> (Int) -> Int{ //定义一个返回值为函数的函数,非常酷吧,这样就把具体的业务逻辑抽象出来,易于代码的维护
return weight <= ? tier1MailFee : tier2MailFee
} func totalPrice(weight:Int) -> Int{
let mailFeeCalc:(Int) -> Int = chooseMailFeeCalcMethod(weight) //返回一个具体的函数
return mailFeeCalc(weight)
} totalPrice() //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)

}

SWIFT Function的更多相关文章

  1. Swift #function 和 _cmd (Objective-C)

    NSStringFromSelector(_cmd); // Objective-C print(__FUNCTION__) // Swift 2 print(#function) // Swift ...

  2. Swift function how to return nil

    这两天在学习Stanford出品的iOS7的课程,这个课程去年也看过,但是看到第3课就不行了,满篇的OC,把人都搞晕了.这段时间因为要写个iOS的App,正好赶上了Swift问世,所以趁着这股劲继续学 ...

  3. 如何在C语言中调用Swift函数

    在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中 ...

  4. Swift与Objective-C交互

    在同一个工程中是可以同时使用Swift和OC的,但不可以同时出现在同一个文件中. OC调用Swift相关信息的方法 在***.m文件中导入工程名-Swift.h即可. 如工程名为ABC,则在需要使用S ...

  5. Swift基础学习笔记

    1.在学基本语法之前,简单看一下与OC的不同 注释:OC       #pragma marks  视图加载完成 Swift    //MARK: 视图加载完成   //TOOO:设置背景颜色(Xco ...

  6. iOS中UIWebView与其中网页的javascript的交互

    首发:个人博客,更新&纠错&回复 1.本地语言调js的方式与android中的方式类似,也是向WebView控件发送要调用的js语句 2. 但js调本地语言,则不是像android那样 ...

  7. macOS webview编程

    好像是macOS10.10之后,以及iOS8之后,新出现的WKWebview组件就迅速的替代了Webview及UIWebView.后者的确存在一些无法解决的bug,诸如架构导致的速度缓慢和内存泄漏. ...

  8. Calling Functions With Pointer Parameters

     参数类型是Constant Pointer 也就是 UnsafePointer<Type> 可以传入的类型: UnsafePointer<Type>/UnsafeMutab ...

  9. 通过百度echarts实现数据图表展示功能

    现在我们在工作中,在开发中都会或多或少的用到图表统计数据显示给用户.通过图表可以很直观的,直接的将数据呈现出来.这里我就介绍说一下利用百度开源的echarts图表技术实现的具体功能. 1.对于不太理解 ...

随机推荐

  1. hdu 3183 A Magic Lamp rmq或者暴力

    A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Pro ...

  2. API接口自动化之3 同一个war包中多个接口做自动化测试

    同一个war包中多个接口做自动化测试 一个接口用一个测试类,每个测试用例如下,比如下面是4个测试用例,每个详细的测试用例中含有请求入参,返回体校验,以此来判断每条测试用例是否通过 一个war包中,若含 ...

  3. c++ primer plus 第七章 课后题答案

    #include <iostream> using namespace std; double HAR_AVG(double, double); void TEST(bool); int ...

  4. android二级listview列表

    今天来实现以下大众点评客户端的横向listview二级列表,先看一下样式. 这种横向的listview二级列表在手机软件上还不太常见,但是使用过平板的都应该知道,在平板上市比较常见的.可能是因为平板屏 ...

  5. Codeforces 918D - MADMAX

    918D - MADMAX 思路: dp+记忆化搜索 状态:dp[i][j][w]表示先手在i节点,后手在j节点,这一轮的字母为w的结果,如果为true,则表示先手必赢,否则后手必赢. 状态转移:如果 ...

  6. Codeforces D - The Child and Zoo

    D - The Child and Zoo 思路: 并查集+贪心 每条边的权值可以用min(a[u],a[v])来表示,然后按边的权值从大到小排序 然后用并查集从大的边开始合并,因为你要合并的这两个联 ...

  7. js实现软件版本号的比较

    //js实现软件版本号的比较 //随机举两个例子 pc2.4.3 或者pc3.5.6 /** * 输入 v1,v2 * 返回true代表v1比v2的版本新,false则代表v1与v2相等或者v1< ...

  8. 查找并替换字符串 Find And Replace in String

    2018-07-29 17:08:15 问题描述: 问题求解: 字符串替换的问题有个技巧就是从右向左进行替换,这样的话,左边的index就不需要考虑变动了. public String findRep ...

  9. spring boot: freemarket模板引擎

    spring boot: freemarket模板引擎 freemarket模板引擎,可以和thymeleaf模板引擎共存 pom.xml引入 <!-- Freemarket --> &l ...

  10. [Java学习] Java异常处理基础

    Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象.当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw).该方法可以选择自己处理异常或传递该异常.两种 ...