李洪强iOS开发Swift篇—07_函数
李洪强iOS开发Swift篇—07_函数
一、函数的定义
(1)函数的定义格式
1 func 函数名(形参列表) -> 返回值类型 {
2 // 函数体...
3
4 }
(2)形参列表的格式
形参名1: 形参类型1, 形参名2: 形参类型2, …
(3)举例:计算2个整数的和
1 func sum(num1: Int, num2: Int) -> Int {
2 return num1 + num2
3 }
(4)没有返回值的函数
如果函数没有返回值,有3种写法

1 func 函数名(形参列表) -> Void {
2 // 函数体...
3 }
4
5 func 函数名(形参列表) -> () {
6 // 函数体...
7 }
8
9 func 函数名(形参列表) {
10 // 函数体...
11 }

(5)没有形参的函数
一个函数如果没有形参,函数名后面的小括号也不能省略
1 func 函数名() -> Int {
2 // 函数体...
3 }
上面的函数没有形参、返回值是Int类型
(6)返回元组的函数
一个函数也可以返回元组数据

1 func find(id: Int) -> (name: String, age: Int) {
2 if id > 0 {
3 return ("jack", 20)
4 } else {
5 return ("nobody", 0)
6 }
7 }
8 var people = find(2)
9 println("name=\(people.name), age=\(people.age)")

二、外部参数名
1.简单说明
一般情况下,通过形式参数的名字,就能推断出这个参数的含义和作用
1 func addStudent(name: String, age: Int, no: Int) {
2 println("添加学生:name=\(name),age=\(age),no=\(no)")
3 }
在函数内部一看参数名就知道这3个参数的作用
但是,形式参数是用在函数内部的,当调用函数时就看不见形参的名字,有可能导致以后会不太明白每个参数的含义
对于addStudent("jack", 20, 19)一眼望去,能猜出第1个参数"jack"是指姓名,后面的20、19分别代表什么含义?
为了解决上述问题,Swift提供了外部参数名语法
外部参数名可以在调用函数时提醒每个参数的含义
2.定义
外部参数名的定义格式如下:
1 func 函数名(外部参数名 形式参数名: 形式参数类型) -> 返回值类型 {
2 // 函数体...
3 }
外部参数名写在形式参数名的前面,与形式参数名之间用空格隔开
3.外部参数名的使用
1 func sum(number1 num1: Int, number2 num2: Int) -> Int
2 {
3 return num1 + num2
4 }
5 sum(number1: 10, number2: 20) // 调用函数
注意:一旦定义了外部参数名,在调用函数时就必须加上外部参数名
4.外部参数名的简写
使用#能简化外部参数名的定义
1 func sum(#num1 : Int, #num2 : Int)
2 {
3 return num1 + num2
4 }
第1行代码的意思:num1、num2既是形式参数名,又是外部参数名
// 调用函数 sum(num1: 10, num2: 20)
三、默认参数值
(1)可以在定义函数时,给形参指定一个默认值,调用函数时,就可以不用给这个形参传值
1 func addStudent(name: String, age: Int = 20) {
2 println("添加1个学生:name=\(name),age=\(age)")
3 }
addStudent("jack")
age参数有个默认值20,所以第4行调用函数时可以不传值给age参数
输出结果是:
添加1个学生:name=jack,age=20
(2)带有默认参数值的形参,Swift会自动给它生成一个跟形参名相同的外部参数名
age: Int = 20相当于#age: Int = 20
因此,如果要传入age参数值时,只能这么调用
addStudent("jack", age: 25)
(3)在带有默认参数值的参数名前加个下划线 _ ,调用函数时就不用写外部参数名
1 func addStudent(name: String, _ age: Int = 20) {
2 println("添加1个学生:name=\(name),age=\(age)")
3 }
4
5 addStudent("jack", 25)
四、常量和变量参数
默认情况下,函数的参数都是常量参数,不能在函数内部修改
1 func test(num: Int) {
2 num = 10
3 }
4
5 func test(num: Int)参数相当于func test(let num: Int)
注意:第2行代码会报错
在有些情况下,可能需要在函数内部修改参数的值,这时需要定义变量参数
在参数名前面加个var即可
1 func test(var num : Int) {
2 num = 10
3 }
// 编写函数在某个字符串的尾部拼接N个其他字符串

1 func append(var string: String, suffix: String, count: Int) -> String
2 {
3 for _ in 0..<count {
4 string += suffix
5 }
6 return string
7 }
8 append("jack", ".", 4) // 调用函数
9 // jack....

五、输入输出参数
1.什么是输入输出参数?
在C语言中,利用指针可以在函数内部修改外部变量的值
在Swift中,利用输入输出参数,也可以在函数内部修改外部变量的值
输入输出参数,顾名思义,能输入一个值进来,也可以输出一个值到外部
2.输入输出参数的定义
在参数名前面加个inout关键字即可
func swap(inout num1: Int, inout num2: Int) {
}
3.代码示例:写一个函数交换外部2个变量的值

1 func swap(inout num1: Int, inout num2: Int) {
2 let tempNum1 = num1
3 num1 = num2
4 num2 = tempNum1
5 }
6 var a = 20
7 var b = 10
8 swap(&a, &b) // 传入的参数前面必须加上&
9 // 执行完swap函数后,a的值是10,b的值是20

4.输入输出参数的使用注意
传递实参时,必须在实参的前面加上&
不能传入常量或者字面量(比如10)作为参数值(因为它们都不可改)
输入输出参数不能有默认值
输入输出参数不能是可变参数
输入输出参数不能再使用let、var修饰(inout和let、var不能共存)
输入输出参数的价值之一
可以实现函数的多返回值(其实让函数返回元组类型,也能实现返回多个值)
李洪强iOS开发Swift篇—07_函数的更多相关文章
- 李洪强iOS开发Swift篇—08_函数(2)
李洪强iOS开发Swift篇—08_函数(2) 一.函数类型 函数类型也是数据类型的一种,它由形参类型和返回值类型组成,格式是 (形参类型列表) -> 返回值类型 1 func sum(num1 ...
- 李洪强iOS开发Swift篇---12_NSThread线程相关简单说明
李洪强iOS开发Swift篇---12_NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThre ...
- 李洪强iOS开发Swift篇---11_变量&常量&元组
李洪强iOS开发Swift篇---11_变量&常量&元组 说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对 ...
- 李洪强iOS开发Swift篇—10_方法
李洪强iOS开发Swift篇—10_方法 一.简单说明 跟其他面向对象语言一样,Swift中的方法可以分为2大类: (1)实例方法(Instance Methods) 在OC中,实例方法以减号(-)开 ...
- 李洪强iOS开发Swift篇—09_属性
李洪强iOS开发Swift篇—09_属性 一.类的定义 Swift与Objective-C定义类的区别 Objective-C:一般需要2个文件,1个.h声明文件和1个.m实现文件 Swift:只需要 ...
- 李洪强iOS开发Swift篇—06_流程控制
李洪强iOS开发Swift篇—06_流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注 ...
- 李洪强iOS开发Swift篇—05_元组类型
李洪强iOS开发Swift篇—05_元组类型 一.元组类型介绍 1.什么是元组类型 元组类型由 N个 任意类型的数据组成(N >= 0),组成元组类型的数据可以称为“元素” 示例: let po ...
- 李洪强iOS开发Swift篇—04_运算符
李洪强iOS开发Swift篇—04_运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运 ...
- 李洪强iOS开发Swift篇—03_字符串和数据类型
李洪强iOS开发Swift篇—03_字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容 let website = "http:// ...
随机推荐
- Nginx+Tomcat+memcached负载均衡实现session共享
http://blog.csdn.net/love_ubuntu/article/details/8464983 1. 安装各个软件不用说了. 2. 到tomcat的安装目录lib中,加入: me ...
- 20160406javaweb 之JDBC简单案例
前几天写的user注册登录注销案例,没有用到数据库,现在做出改动,使用数据库存储信息: 一.首先我们需要建立一个数据库: 如下图: 创建数据库的代码如下: -- 导出 database02 的数据库结 ...
- ORACLE 11g R2数据库安装硬件环境要求
物理内存要求:最小1G,在windows7,windows8,windows8.1上最小2G. 虚拟内存(或分页空间)容量要求: Available RAM Swap Space Required B ...
- apparmor介绍
AppArmor AppArmor 类似于selinux ,主要的作用是设置某个可执行程序的访问控制权限,主要区别就在于apparmor是以路径(path)为基础,而selinux以i节点(inode ...
- 幾種方法實現C語言Macro for debug
1. #include <stdio.h> #include <stdlib.h> #define DEBUG 1 #ifdef DEBUG #define DEBUG_PRI ...
- ASP.NET获取上传图片的大小
1.采用客户端javascript可以取得图片大小 <input id="FileUpload" type="file" size="30&qu ...
- apache常用工作模式的区别
apache常用工作模式有两种 worker模式1.线程模式2.占用资源少3.稳定性略差4.并发大 prefork模式1.进程模式2.占用资源多3.稳定4.并发一般 来自为知笔记(Wiz)
- Linux下Docker安装
1 在 CentOS 6.4 上安装 docker docker当前官方只支持Ubuntu,所以在 CentOS 安装Docker比较麻烦(Issue #172). docker官方文档说要求 ...
- JavaScript符串中每个单词的首字母大写化
map() + replace() function titleCase(str) { var convertToArray = str.toLowerCase().split(" &quo ...
- javascript 事件流及应用
当页面元素触发事件的时候,该元素的容器以及整个页面都会按照特定顺序发生该元素的触发 事件,事件传播的顺序叫做事件流 1.事件流的分类: A.冒泡型事件(所有浏览器都支持) 由明确的事件源到最不确定 ...