好了,让我们开始接着前几天写的系列博客开始今天的这篇博客。在swift里面如果你需要定义一个方法的话,你需要使用关键字:func,请看下面的这段代码:

func sayHello(name:String)->String{

return "hello"+name;

}

在这个方法里面,我们定义了一个String的name参数,同时这个方法返回一个String类型的返回值。请看下面其他类型的方法:

func sayHello(name:String){

println("hello,xiaocai");   //不带返回值,其实在swift里面是返回一个Void类型,一个空的元组

}

func sayHello(number1:Int,number2:Int)->Int{

return number1+number2;   //带多个参数的方法,实参之间用","隔开

}

func sayHello()->String{

return "hello";  //不带实参的方法

}

上面这些方法结构跟其他语言里面都是大同小异的,但是在swift里面还有一些自己特有的方法结构,请看:

func getStudent()->(id:Int,name:String,age:Int){

return (2010,"xiaocai","0");   //我们可以直接组合一个元组返回信息,然后从元组里面取出对应的数值

}

看到上面的那个方法,你可能会疑惑我应该怎样去接受这样的一个返回值呢?其实很简单:

let (id,name,age)=getStudent();   //返回值就对应到三个常量里面去了

上面我们定义的方法只是带有局部的参数,在swift里面还允许我们定义外部参数。那么局部参数和外部参数有什么区别呢?其实局部参数的作用域只在该方法里面,然而外部参数的作用域是可以在方法外的。请看下面的方法:

func localPara(name:String,age:Int)->String{

return "hello name,you are \(age)";

}

然后我们可以这样调用该方法:

println(localPara("xiaocai",age:23));

这是怎么回事呢?为什么第一个实参我们可以直接传入参数,但是第二个实参我们却要在前面加上age:呢?其实在swift里面除了第一个实参之外,后面的参数默认都是全局的参数。那么我们有什么方法可以将所有的实参都定义成全局的吗?有两种方法:

func extendPara(extentName localName:String)->String{

return localName;   //先申明一个全局的参数,然后给出一个本地的参数

}

调用的时候,我们应该如下:

println(extentPara(extentName:"xiaocai"));   //使用这种全局实参的好处就是使代码更加的易懂,读起来就像一句话,这点跟oc是很像的

还有一种申明全局实参的方法如下:

func extentPara(#name:String,#age:Int)->String{

return name+String(age);

}

调用如下:extentPara(name:"xiaocai",age:23);

在swift里面还有另外一种特殊结构的方法,请看:

func keBianPara(numbers:Double...)->Double{

Double sum;

for number in  numbers{

sum+=number;

}

return sum;

}

初一看,你可能会很疑惑这是什么东东呢?参数里面的Double...表示什么意思呢?如果你看过前面的博客你应该还记得...是闭包运算吧!其实Double...就相当于一个Double类型的数组。并且这个数组的长度是可变的,这个方法接收的参数就是可变的Double类型数组。

在swift里面所有的实参默认都是常量的,也就是说在方法里面我们是不允许修改实参的数值。如下的代码:

func changePara(number1:Int,number2:Int)->Int{

number1+=number2;

return number1;

}

这段代码有没有错误呢?这段代码在编译的时候肯定是通不过的,因为number1默认是let类型。如果我们想修改实参的话,我们应该怎么做呢?

func changePara(var number1:Int,number2:Int)->Int{

number1+=number2;

return number1;

}

这样编译运行就是OK的了。让我们来想一想在其他语言里面可以进行这样的操作吗?比如c#里面:

private int ChangePara(int number1,int number2)

{

number1+=number2;

return number1;     //这样可行吗?

}

这样应该是可以的,但是我们一般不进行这样的操作,我们直接:return number1+number2;不是更加的简单直接吗?

在c#里面,我们可以使用in,out关键字来标记当前的参数是按照应用来传递的,让我们来看一看在c#里面的out关键字的使用:

private void UseOutPara(out sting origionName)

{

origionName="xiaocai";

}

那么我们应该怎样去调用呢?

private void TestUseOut()

{

string newName;

UseOutPara(newName);

Console.Writeln(newName);

}

想一想最终输出的newName是什么呢?会是为null,还是“xiaocai”呢?

其实在swift里面也是有inout类型的,但是使用方式不太一样,请看:

func swapTwoInts(inout a:Int,inout b:Int){

let temp=a;

a=b;

b=temp;

}

我们再来看一看调用的方式:

var oneInt=3;

var twoInt=107;

swapTwoInts(&oneInt,&twoInt);

println("One:\(ontInt),Two:\(twoInt)");

这个输出会是什么呢?你有没有注意到调用方法里面的实参前面添加了一个&,这个&就是表示该实参是可以修改的。

在swift里面还有一个比较牛逼的地方就是可以允许申明一个函数类型,哈哈哈这个性能真的很有趣。让我们先来搞清楚什么是函数类型呢?我们来看一下下面这个函数结构:

func testFunc(number1:Int,number2:Int)->Int{

return number1+number2;

}

上面那个函数类型是什么呢?有两个Int类型的实参,一个Int类型的返回值,那么我们就说该函数的类型为:(Int,Int)->Int,如果我们将函数类型传递到另外一个函数里面会产生什么效果呢?是不是就相当于产生了一个委托了。我们来看一看下面这个代码:

func testFuncType(funcType:(Int,Int)->Int,number1:Int,number2:Int)->Int{

return funcType(number1,number2);

}

调用这个方法如下:testFuncType(testFunc,10,20);

swift学习初步(四)-- 函数的更多相关文章

  1. Swift中文教程(四)--函数与闭包

    原文:Swift中文教程(四)--函数与闭包 Function 函数 Swift使用func关键字来声明变量,函数通过函数名加小括号内的参数列表来调用.使用->来区分参数名和返回值的类型: fu ...

  2. swift学习笔记2——函数、闭包

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  3. Swift学习初步(一)

    前几天刚刚将有关oc的教程草草的看了一遍,发现oc其实也不像传说的那么难.今天又开始马不停蹄的学习Swift因为我很好奇,到底苹果出的而且想要代替oc的编程语言应该是个什么样子呢?看了网上的一些中文教 ...

  4. Swift学习笔记四

    前面三篇笔记通过一些示例展示了Swift的一些特性,粗略地介绍了它的语法和特色,从这一篇笔记开始,将正式系统地介绍Swift的语法和特性了. Swift是一门为iOS和OSX开发准备的全新语言,但是它 ...

  5. Swift学习笔记四:数组和字典

      Swift 提供两种集合类型来存储集合,数组和字典. 数组是一个同类型的序列化列表集合.字典是一个能够使用相似于键的唯一标识符来获取值的非序列化集合.也就是说数组是有序的.字典是无序的. 一. 数 ...

  6. python学习笔记(四):函数

    一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...

  7. Swift学习笔记(8)--函数

    1.定义及调用 func sayHelloAgain(personName: String) -> String { return "Hello again, " + per ...

  8. Swift学习 (四)

    5.枚举与结构体: 不必给枚举成员提供一个值.如果我们想要为枚举成员提供一个值(raw value),我们可以用字符串,字符,整型或浮点数类型. 1 2 3 4 5 6 7 enum CompassP ...

  9. swift学习笔记之-函数

    //函数 import UIKit /*获得系统时间 var date = NSDate() var timeFormatter = NSDateFormatter() timeFormatter.d ...

随机推荐

  1. 深度分析DB2修改表

    DB2修改表操作相信大家都不陌生,下文对DB2修改表方面结合了一些例子进行了详细的分析讨论,供您参考学习. DB2修改表使用ALTER TABLE语句来更改列属性,例如可空性.LOB选项.作用域.约束 ...

  2. 【MySQl】MyISAM和InnoDB索引对比

    部分内容转自:http://www.2cto.com/database/201211/172380.html 比较好的文章:http://www.cnblogs.com/hustcat/archive ...

  3. 【MySQL】MySQL索引背后的之使用策略及优化【转】

    转自:http://database.ctocio.com.cn/353/11664853.shtml 另外很不错的对于索引及索引优化的文章: http://www.cnblogs.com/magia ...

  4. 前端工程筹建NodeJs+gulp+bower

    1.安装nodejs nodejs 官网下载安装文件 安装完成之后,在命令窗口执行,(显示nodejs版本) 和(显示npm版本)可以使用这两个命令查看是否安装成功: node -v npm -v 2 ...

  5. 一、Linux目录结构

    转自:http://www.cnblogs.com/JCSU/articles/2770249.html 你想知道为什么某些程序位于/bin下,或者/sbin,或者/usr/bin,或/usr/sbi ...

  6. EasyUI-Combox

    Combox的数据格式和默认选中项设置 [{ "id":1, "text":"text1" },{ "id":2, &q ...

  7. 使用select io复用实现超时设置

    在linux的socket编程中,经常会遇到超时设置的问题,例如请求方如果在Ks内不发送数据则服务器要断开连接停止服务.这里我使用select的io复用实现超时5s设置,具体代码片段如下: fd_se ...

  8. 一款简单射击游戏IOS源码

    源码描述: 一款基于cocos2d的简单设计游戏,并且也是一款基于cocos2d的简单射击游戏(含苹果IAD广告), 游戏操作很简单,哪个数字大就点击射击哪个.里面有苹果iad广告,功能简单完整,适合 ...

  9. url中文参数解决方案

    首先,弄清楚为什么url传递中文会转码或者乱码,以及http头 contentType="text/html; charset=GBK" 的作用. html代码会经过web服务器, ...

  10. CentOS学习笔记--SCSI 设备热插拔

    CentOS学习笔记--SCSI 设备热插拔 处于运行中的服务器,因业务要求也许不允许重启机器,而新添加的SCSI设备(主要是硬盘)如何实现热插拔呢? 首先需要查看一下设备: #cat /proc/s ...