/*
函数(Function)
函数是为执行特定功能的自包含的代码块。函数需要给定一个特定标识符(名字),然后当需要的时候,
就调用此函数来执行功能。
*/
// 函数的定义与调用
// 定义函数时,使用关键字func,返回值类型通过->指明,如下:
// 函数名:sayHello,
// 参数列表中只有一个参数,叫personName,参数类型是String
// 函数返回值类型:String
func sayHello(personName: String) -> String {
let greeting = "Hello, " + personName + "!"
return greeting
} // 函数调用
println(sayHello("Anna")) // prints "Hello, Anna"
println(sayHello("Brian")) // prints "Hello, Brian" // 简化函数体
func sayHelloAgain(personName: String) -> String {
return "Hello, " + personName + "!"
} println(sayHelloAgain("Anna")) // 函数可以有多个参数
/*!
* @brief 返回两个值的差
* @param start Int类型,范围区间的起点
* @param end Int类型,范围区间的终点
* @return 返回值为Int类型,表示终点-起点的值
*/
func halfOpenRangeLength(start: Int, end: Int) -> Int {
return end - start
}
println(halfOpenRangeLength(, )) // prints "9" // 无参数函数
func sayHelloWorld() -> String {
return "Hello, world"
}
println(sayHelloWorld()) // 无返回值的函数,其实这里没有指定返回值,也会返回一个特殊的值,Void
func sayGoodbye(personName: String) {
println("Goodbye, \(personName)!")
}
sayGoodbye("David") // 函数返回值是可以忽略的
func printAndCount(stringToPrint: String) -> Int {
println(stringToPrint)
return countElements(stringToPrint) // 计算字符串的长度
} // 不带返回值
func printWithoutCounting(stringToPrint: String) {
printAndCount(stringToPrint)
} printAndCount("Hello,world")
printWithoutCounting("hello, world") /*
* @brief 函数可以返回元组(多个值)
* @param string 字符串
* @return (vowels: Int, consonants: Int, others: Int)
* vowels:元音, consonants:辅音,others:其它字符
*/
func count(string: String) ->(vowels: Int, consonants: Int, others: Int) {
var vowels =
var consonants =
var others =
for c in string {
switch String(c).lowercaseString {
case "a", "o", "e", "i", "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") // 外部参数名(External Parameter Names)
// 有时候使用外部参数名是很有用的,这直到提示的作用,就好像OC语法中的参数一样,见名知意
func someFunction(externalParameterName localParameterName: Int) {
// do something
} // 看例子:
func join(lhsString: String, rhsString: String, joiner:String) -> String {
return lhsString + joiner + rhsString
}
// 这里调用的时候,没有外部参数名
join("hello", "world", ",") // prints "hello,world" // 加上#号后,参数名与外部名相同,这是快捷方式
func join(#lhsString: String, #rhsString: String, #joiner:String) -> String {
return lhsString + joiner + rhsString
}
// 调用方式
join(lhsString: "hello", rhsString: "world", joiner: ",") // prints "hello,world" // 可以不使用快捷方式
func join(lhsString: String, rhsString: String, withJoiner joiner: String) -> String {
return lhsString + joiner + rhsString
}
join("hello", "world", withJoiner: ",")// prints "hello,world" // 函数参数默认值
// 参数参数可以提供默认值,但是默认值只能是参数列表的最后,也就是说
// 如果arg1提供默认值,后面的都需要提供默认值。
func join(#originalString: String, #destinationString: String, #withJoiner: String = " ") -> String {
return originalString + withJoiner + destinationString
}
join(originalString: "hello", destinationString: "world", withJoiner: "-") // prints "hello-world"
join(originalString: "hello", destinationString: "world") // prints "hello world" // 如果提供了参数默认值,Swift会自动把这个参数名也作为外部参数名
// 这里withJoiner相当于加上了#:#withJoiner
func join(lhsString: String, rhsString: String, withJoiner: String = " ") -> String {
return lhsString + withJoiner + rhsString
}
join("hello", "world", withJoiner: "-")// // prints "hello-world" // 可变参数
// 可变参数接受0个或者多个指定类型的值。可变参数使用...表示
// 函数最多只能有一个可变参数,并且如果有可变参数,这个可变参数必须出现在参数列表的最后
// 如果参数列表中有一或多个参数提供默认值,且有可变参数,那么可变参数也要放到所有最后一个
// 提供默认值的参数之后(先是默认值参数,才能到可变参数)
func arithmeticMean(numbers: Double...) -> Double {
var total = 0.0
for number in numbers {
total += number
}
return total / Double(numbers.count)
} arithmeticMean(, , , , ) // return 3.0
arithmeticMean(, , ) // return 2.0 // 常量和变量参数
// 在函数参数列表中,如果没有指定参数是常量还是变量,那么默认是let,即常量
// 这里Str需要在函数体内修改,所以需要指定为变量类型,即用关键字var
func alignRight(var str: String, count: Int, pad: Character) -> String {
let amountToPad = count - countElements(str) // 使用_表示忽略,因为这里没有使用到
for _ in ...amountToPad {
str = pad + str
} return str
} // 输入/输出参数
// 有时候,在函数体内修改了参数的值,如何能直接修改原始实参呢?就是使用In-Out参数
// 使用inout关键字声明的变量就是了
// 下面这种写法,是不是很像C++中的传引用?
func swap(inout lhs: Int, inout rhs: Int) {
let tmp = lhs
lhs = rhs
rhs = tmp
}
// 如何调用呢?调用的调用,对应的实参前面需要添加&这个符号
// 因为需要修改,所以一定是var类型的
var first =
var second =
// 这种方式会修改实参的值
swap(&first, &second) // first = 4, second = 3 // 使用函数类型
// 这里是返回Int类型
// 参数类型是:(Int, Int) -> Int
func addTwoInts(first: Int, second: Int) -> Int {
return first + second
}
// 参数类型是:(Int, Int) -> Int
func multiplyTwoInts(first: Int, second: Int) -> Int {
return first * second
} var mathFunction: (Int, Int) -> Int = addTwoInts
mathFunction(, ) // return 3
mathFunction = multiplyTwoInts
mathFunction(, ) // return 2 // 参数可以作为参数
func printMathResult(mathFunction: (Int, Int) -> Int, first: Int, second: Int) {
println("Result: \(mathFunction(first, second))")
} printMathResult(addTwoInts, , ) // prints "Result: 8"
printMathResult(multiplyTwoInts, , ) // prints "Result: 15" // 函数作为返回类型
func stepForward(input: Int) -> Int {
return input +
} func stepBackward(intput: Int) -> Int {
return input -
} func chooseStepFunction(backwards: Bool) -> ((Int) -> Int) {
return backwards ? stepBackward : stepForward
} var currentValue =
let moveNearerToZero = chooseStepFunction(currentValue > ) // call stepBackward() function // 参数可以嵌套定义,在C、OC中是不可以嵌套的哦
func chooseStepFunction(backwards: Bool) -> ((Int) -> Int) {
func stepForward(input: Int) -> Int {
return input +
} func stepBackward(input: Int) -> Int {
return input +
} return backwards ? stepBackward : stepForward
}

使用函数类型

在 Swift 中,使用函数类型就像使用其他类型一样。例如,你可以定义一个类型为函数的常量或变量,并将函数赋值给它:

var mathFunction: (Int, Int) -> Int = addTwoInts

这个可以读作:

“定义一个叫做 mathFunction 的变量,类型是‘一个有两个 Int 型的参数并返回一个 Int 型的值的函数’,并让这个新变量指向 addTwoInts 函数”。

addTwoInts 和 mathFunction 有同样的类型,所以这个赋值过程在 Swift 类型检查中是允许的。

函数类型作为参数类型也可以作为返回类型,如上代码

Swift-函数的理解的更多相关文章

  1. Swift函数编程之Map、Filter、Reduce

    在Swift语言中使用Map.Filter.Reduce对Array.Dictionary等集合类型(collection type)进行操作可能对一部分人来说还不是那么的习惯.对于没有接触过函数式编 ...

  2. opengl中对glOrtho()函数的理解

    glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工程中的制图等.需要比较精确的显示. 而作为它的对立情况, glFrustum则产生一个 ...

  3. 回调函数透彻理解Java

    http://blog.csdn.net/allen_zhao_2012/article/details/8056665 回调函数透彻理解Java 标签: classjavastringinterfa ...

  4. 对c语言中malloc和free函数的理解

    最近在复习c语言的时候再次用到了malloc函数和free函数,此处着讲解一下自己对这两个函数的理解和认识. 一. malloc函数和free函数的基本概念和基本的用法 对于malloc函数: 1.  ...

  5. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

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

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

  7. Swift 函数

    1: 函数形式: Swift函数以关键字func 标示.返回类型->后写明.如果没有返回类型可以省去.多个参数用,分割.其中参数名字在前:类型描述 func GetName(strName:St ...

  8. swift函数的用法,及其嵌套实例

    import Foundation //swift函数的使用 func sayHello(name userName:String ,age:Int)->String{ return " ...

  9. JS匿名函数的理解

    js匿名函数的代码如下:(function(){ // 这里忽略jQuery 所有实现 })(); 半年前初次接触jQuery 的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的 ...

  10. js回调函数(callback)理解

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

随机推荐

  1. 模拟MBR Grub故障修复

    1.  MBR故障修复 备份 mkdir /pp mount /dev/sdb1 /pp dd if=/dev/sda of=/pp/mrb.bak bs=512 count=1   破坏mrb dd ...

  2. 《JQuery常用插件教程》系列分享专栏

    <JQuery常用插件教程>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201719.html 文章 使用jquery插件实现图 ...

  3. 两步搞定一台电脑同时开启多个tomcat

    1. 修改tomcat中的某些参数,为了避免启动tomcat时出现冲突,编辑bin/startup.bat, 在文件第一行添加如下两行(必须第一行才有效) SET JAVA_HOME=C:\webso ...

  4. postgresql 日期类型处理实践

    ---- 日期+1 select date '2018-01-14' + integer '1'; 结果: 2018-01-15 ---- 日期+1 后 转 20180101 日期字符串 select ...

  5. Angularjs 自定义指令 (下拉菜单)

    为什么要自定义控件?html的select 不是可以用么?以前我就是这么想的,当我接到特殊需求时,需要我自己写一个下拉控件. 这个需求就是将图表横向放大,由于H5不能控制设备转向,所以我将图表通过cs ...

  6. 为什么我要放弃javaScript数据结构与算法(第四章)—— 队列

    有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第四章 队列 队列数据结构 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序 ...

  7. Tomcat 8.5 基于 Apache Portable Runtime(APR)库性能优化

    Tomcat可以使用Apache Portable Runtime来提供卓越的性能及可扩展性,更好地与本地服务器技术的集成.Apache Portable Runtime是一个高度可移植的库,位于Ap ...

  8. Eclipse安装Java Class反编译插件

    第一步:没有安装之前 第二步:从Eclipse Marketplace里,安装反编译插件jadclipse. 第三步:安装反编译插件之后,多了一个查看器,把"类反编译查看器"设置为 ...

  9. 搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

    调试Django框架写的服务时,需要模拟客户端发送POST请求,然而浏览器只能模拟简单的GET请求(将参数写在url内),网上搜索得到了HttpRequester这一firefox插件,完美的实现了模 ...

  10. js中call()方法和apply方法的使用

    1. 方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...