Swift学习笔记(8)--函数
1.定义及调用
func sayHelloAgain(personName: String) -> String {
return "Hello again, " + personName + "!"
}
println(sayHelloAgain("Anna")) //Hello again, Anna!
2.函数分类
//1.普通函数(略) //2.无参函数
func sayHelloWorld() -> String {
return "hello, world"
} //3.无返回值函数
func sayHelloWorld(){
println("hello, world")
} //4.多参数函数
func add(start: Int, end: Int) -> Int {
return end + start
} //5.多返回值函数
//例子:统计一个字符串中元音辅音的数量
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
var vowels = 0, consonants = 0, others = 0
for character in string {
switch String(character).lowercaseString {
case "a", "e", "i", "o", "u":
++vowels
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
++consonants
default:
++others
}
}
return (vowels, consonants, others)
} let total = count("some arbitrary string!")
println("\(total.vowels) vowels and \(total.consonants) consonants") //6 vowels and 13 consonants
3.外部参数名
局部参数名(local parameter name)
,只能在函数体中使用
外部参数名(External Parameter Names),函数的使用者在调用函数时提供参数名字
与OC类似,swift提供了外部参数名的定义方法:
//1.显示定义外部参数名
func join(firstName s1: String,lastName s2: String, middleName s3:String) {
println("The name is :\(s1) \(s3) \(s2)")
} join(firstName: "Jason", lastName: "Wood", middleName: "Hasen") //2.隐式定义外部参数名,使用 # + 参数名
func join2(#firstName: String,#lastName: String, #middleName:String) {
println("The name is :\(firstName) \(middleName) \(lastName)")
}
join2(firstName: "Jason", lastName: "Wood", middleName: "Hasen")
4.默认参数值
在函数定义时可以提供一个默认的参数值
func join(string s1: String, toString s2: String, withJoiner joiner: String = "-") -> String {
return s1 + joiner + s2
}
println(join(string: "hello", toString:"world")) //hello-world
为了使定义外部参数名更加简单,当你未给带默认值的参数提供外部参数名时,Swift 会自动提供外部名字。此时外部参数名与局部名字是一样的,就像你已经在局部参数名前写了井号(#)
一样。
func join(s1: String, s2: String, joiner: String = " ") -> String {
return s1 + joiner + s2
}
println(join("hello", "world", joiner: "-")) //hello-world
5.可变参数(Variadic Parameters)
一个可变参数(variadic parameter)
可以接受一个或多个值。函数调用时,你可以用可变参数来传入不确定数量的输入参数。通过在变量类型名后面加入(...)
的方式来定义可变参数。
注:一个函数至多能有一个可变参数,而且它必须是参数表中最后的一个。这样做是为了避免函数调用时出现歧义。
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
println("平均值为:\(arithmeticMean(1, 2, 3, 4, 5))") //平均值为:3.0
6.常量参数和变量参数(Constant and Variable Parameters)
函数参数默认是常量。试图在函数体中更改参数值将会导致编译错误。这意味着你不能错误地更改参数值。
但是,有时候,如果函数中有传入参数的变量值副本将是很有用的。你可以通过指定一个或多个参数为变量参数,从而避免自己在函数中定义新的变量。变量参数不是常量,你可以在函数中把它当做新的可修改副本来使用。
通过在参数名前加关键字 var
来定义变量参数:
func changeValue(var x:Int){
x = 12 //如果不定义var,此处语句会报错
} //函数内部的参数变化是副本值的变化,函数外部的值不受影响
var y = 0
changeValue(y)
println(y) //还是0
7.输入输出参数(In-Out Parameters)
变量参数,正如上面所述,仅仅能在函数体内被更改。如果你想要一个函数可以修改参数的值,并且想要在这些修改在函数调用结束后仍然存在,那么就应该把这个参数定义为输入输出参数(In-Out Parameters)。
定义一个输入输出参数时,在参数定义前加 inout
关键字。一个输入输出参数有传入函数的值,这个值被函数修改,然后被传出函数,替换原来的值。
你只能传入一个变量作为输入输出参数。你不能传入常量或者字面量(literal value),因为这些量是不能被修改的。当传入的参数作为输入输出参数时,需要在参数前加&
符,表示这个值可以被函数修改。
注:输入输出参数不能有默认值,而且可变参数不能用 inout
标记。如果你用 inout
标记一个参数,这个参数不能被 var
或者 let
标记。
func changeValue2(inout x:Int){
x = 12
} var y = 0 //inout传入的参数只能是变量
changeValue2(&y) //需要在参数前加 & 来标记是inout参数
println(y) //此时打印出来的是修改后的值 12
8.函数类型(Function Types)
每个函数都有种特定的函数类型,由函数的参数类型和返回类型组成。
比如下面两个函数的函数类型就是(Int, Int) -> Int, 可以读作“有两个 Int
型的参数并返回一个 Int
型的值。”
func addTwoInts(a: Int, b: Int) -> Int {
return a + b
}
func multiplyTwoInts(a: Int, b: Int) -> Int {
return a * b
}
而对于无参数和无返回值的函数类型为() -> (),叫“没有参数,并返回 Void
类型的函数。”。没有指定返回类型的函数总返回Void
。在Swift中,Void
与空的元组是一样的。
使用举例:
func addTwoInts(a: Int, b: Int) -> Int {
return a + b
}
func multiplyTwoInts(a: Int, b: Int) -> Int {
return a * b
} //定义
var mathFunction: (Int, Int) -> Int = addTwoInts //调用与函数调用一样
println("Result: \(mathFunction(2, 3))") //Result: 5 //相同匹配类型的不同函数可以被赋值给同一个变量
mathFunction = multiplyTwoInts
println("Result: \(mathFunction(2, 3))") //Result: 6 //当赋值一个函数给常量或变量时,没有定义函数类型, Swift会自动推断其函数类型
let anotherMathFunction = addTwoInts //anotherMathFunction 此时的函数类型就是 (Int, Int) -> Int
println("Result: \(anotherMathFunction(3, 4))") //Result: 7 //函数类型作为参数类型
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
println("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5) //Result: 8 //函数类型作为返回值类型
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward //根据条件返回不同的函数类型
} var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0) //获取函数类型
let result = moveNearerToZero(currentValue) //根据函数类型,得到结果
println(result) //2
9.嵌套函数(Nested Functions)
把函数定义在别的函数体中,称作嵌套函数(nested functions)。
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backwards ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(currentValue > 0)
let result = moveNearerToZero(currentValue) //根据函数类型,得到结果
println(result) //-3
Swift学习笔记(8)--函数的更多相关文章
- swift学习笔记2——函数、闭包
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记之-函数
//函数 import UIKit /*获得系统时间 var date = NSDate() var timeFormatter = NSDateFormatter() timeFormatter.d ...
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- Matlab学习笔记 figure函数
Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...
- matlab学习笔记 bsxfun函数
matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
- Swift学习笔记(14)--方法
1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方 ...
- matlab学习笔记13_1 函数返回值
一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://blog.csdn.net/qq_36556 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- 操作指定文件格式的10个Perl CPAN模块
在Perl开发中,非常可能会碰到一些不同格式的文件--XML.PDF.CSV及RSS文件等,和一些不同的二进制数据格式.Perl应用程序须要操作这些文件,对它们进行读写. 此时.能够求助于全面Perl ...
- ural 1143. Electric Path(凸包上最短哈密顿路径)
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1143 题意:逆时针给一个凸包的n(n<=200)个顶点坐标,求一个最短哈密顿路径的 ...
- bzoj1012: [JSOI2008]最大数maxnumber(貌似是道线段树喔)
1012: [JSOI2008]最大数maxnumber 题目:传送门 题解: 发现自己空了一道水题... 1~210000建线段树,其实就是一道裸题... 单点修改+区间查询...1A~ 代码: # ...
- m_Orchestrate learning system---二十五、复制类的时候最容易出现的错误是什么
m_Orchestrate learning system---二十五.复制类的时候最容易出现的错误是什么 一.总结 一句话总结:命名空间错误导致Analyze类虽然继承了Base类,但是没有执行里面 ...
- vue组件的一些知识理解
组件我们在项目中会很常用到,说下自己在学习过程中的理解,有关 组件初始化顺序,组件为什么data是function,组件的生命周期 1. Vue.component('', {}) 注册全局组件,组 ...
- Java SpringMvc Jar包下载及部署方式_转载
本次来记录一下关于 springmvc jar包的下载以及部署 首先登陆 http://repo.spring.io/release/org/springframework/spring/到里面我 ...
- 运维派 企业面试题1 监控MySQL主从同步是否异常
Linux运维必会的实战编程笔试题(19题) 企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员.提示:如果没主从同步环境,可以用下面文本放到文件里读 ...
- ConEmu windows上的终端工具
ConEmu Windows terminal 官网: http://conemu.github.io/
- Shell应用之网卡流量监测
需求分析 1)按固定时间监测一次网卡流量 2)当网卡流量为0时重启网卡 一.网卡流量查询 sar(System ActivityReporter系统活动情况报告)是目前Linux上最为全面的系统性能分 ...
- Delayer 基于 Redis 的延迟消息队列中间件
Delayer 基于 Redis 的延迟消息队列中间件,采用 Golang 开发,支持 PHP.Golang 等多种语言客户端. 参考 有赞延迟队列设计 中的部分设计,优化后实现. 项目链接:http ...