【Swift学习】Swift编程之旅---函数(十)
函数是一组用于执行特定任务的独立的代码段,你用一个名字来标识函数,这个名字是用来“调用”函数来执行它的任务。
swift统一函数的语法具有足够的灵活性来表达任何一个简单的不带参数的名称与本地和外部的每个参数的参数名称的复杂objective-c-style C风格的函数方法。参数可以提供默认值,以简化函数调用,并且可以通过在输出参数中,一旦该功能完成了它的执行,它就可以修改传递的变量
swift每一个函数都有一个类型,由形参类型和返回类型组成。你可以使用这种类型的任何其他类型,这使得它很容易将函数作为参数的其他函数,并返回函数的函数。函数还可以用其他函数来封装在嵌套函数作用域内的有用函数。
定义和调用函数
func sayHello(personName: String) -> String {
let greeting = "Hello, " + personName + "!"
return greeting
}
print(sayHello("Anna"))
// Prints "Hello, Anna!"
print(sayHello("Brian"))
// Prints "Hello, Brian!
sayHello是函数的名称,personName是它的参数,类型是String,返回一个String类型的数据,使用->符号来标识函数的返回类型,后面是函数的返回类型。
函数的形参和返回值
函数参数和返回值是非常灵活的。您可以从一个简单的实用程序函数中定义任何一个简单的函数,用一个未命名的参数来定义一个复杂的函数。
无参函数
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
// Prints "hello, world
多参函数
func sayHello(personName: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return sayHelloAgain(personName)
} else {
return sayHello(personName)
}
}
print(sayHello("Tim", alreadyGreeted: true))
// Prints "Hello again, Tim!
无返回值函数(实际返回void)
func sayGoodbye(personName: String) {
print("Goodbye, \(personName)!")
}
sayGoodbye("Dave")
// Prints "Goodbye, Dave!
func printAndCount(stringToPrint: String) -> Int {
print(stringToPrint)
return stringToPrint.characters.count
}
func printWithoutCounting(stringToPrint: String) {
printAndCount(stringToPrint)
}
printAndCount("hello, world")
// prints "hello, world" and returns a value of 12
printWithoutCounting("hello, world")
// prints "hello, world" but does not return a value
多返回值函数
func minMax(array: [Int]) -> (min: Int, max: Int) {
var currentMin = array[]
var currentMax = array[]
for value in array[..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
let bounds = minMax([, -, , , , ])
print("min is \(bounds.min) and max is \(bounds.max)")
// Prints "min is -6 and max is 109
函数形参名
函数的形参包括本地和外部参数名。外部参数名称用于将参数传递给函数调用。函数的实现中使用了局部参数名称
func someFunction(firstParameterName: Int, secondParameterName: Int) {
// function body goes here
// firstParameterName and secondParameterName refer to
// the argument values for the first and second parameters
}
someFunction(, secondParameterName: )
默认形参值
您可以在参数类型之后给任何的参数设置一个默认值,如果您设置了默认值,那么就可以在调用该函数时忽略此参数。
func someFunction(parameterWithDefault: Int = ) {
// function body goes here
// if no arguments are passed to the function call,
// value of parameterWithDefault is 12
}
someFunction() // parameterWithDefault is 6
someFunction() // parameterWithDefault is 12
在函数的参数列表的结尾处设置默认值
可变参数
一个可变的参数接受特定类型的零个或多个值。当函数被调用时,你使用一个可变的参数可以传入不同数量的指定类型的参数,在参数类型名称后面插入...来实现可变参数。函数体的可变参数值被当做一个特定类型的数组来处理。例子如下
func arithmeticMean(numbers: Double...) -> Double {
var total: Double =
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(, , , , )
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(, 8.25, 18.75)
// returns 10.0, which is the arithmetic mean of these three numbers
numbers: Double...被当做一个存放Double类型的数组,我们可以遍历它的每一个元素
注意:一个函数只能有一个可变参数
In-Out 形参
函数参数默认为常量,在函数体内修改参数值会发生编译时错误,这意味着你不能改变一个参数的值。如果你想要一个函数来修改某个参数的值,并希望这些改变在函数调用结束后是永久的,那么使用 in-out参数来代替
使用inout关键字来定义一个in-out参数,但是参数不能为常量,只能为变量。当你调用时直接在参数名前加&符号来标识此参数可以被该函数修改。
func swapTwoInts(inout a: Int, inout _ b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
来看一下如何调用
var someInt =
var anotherInt =
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3”
函数类型
每个函数都有一个特定的函数类型,由形参类型和函数的返回类型组成
func addTwoInts(a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInts(a: Int, _ b: Int) -> Int {
return a * b
}
这个例子定义了addTwoInts,multiplyTwoInts2个函数,它们的类型都是(Int, Int) -> Int
func printHelloWorld() {
print("hello, world")
}
它的类型是()->Void
函数类型的使用
在swift中您可以像任何其他类型一样的使用函数类型。例如,你可以定义一个常量或变量为一个函数类型,并为变量指定一个对应的函数:
var mathFunction: (Int, Int) -> Int = addTwoInts
可以解读为:"定义一个名为mathFunction变量,该变量的类型为'一个函数,它接受两个Int值,并返回一个Int值。'设置这个新的变量来引用名为addTwoInts函数。
该addTwoInts函数具有与mathFunction相同类型的变量,所以这个赋值能通过swift的类型检查。
现在你可以使用mathFunction来调用指定的函数:
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 5
与其他类型一样,当你给函数赋一个常量或者变量时,你可以让Swift去推断函数的类型。
let anotherMathFunction = addTwoInts
// anotherMathFunction is inferred to be of type (Int, Int) -> Int
作为形参类型的函数类型
可以使用一个函数类型,如(Int, Int)->Int作为另一个函数的形参类型。这使你预留了一个函数的某些方面的函数实现,让调用者提供的函数时被调用。
func printMathResult(mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, , )
// Prints "Result: 8
作为返回类型的函数类型
你可以将一个函数类型作为另一个函数的返回类型。你可以在返回函数的返回箭头(->) 后立即编写一个完整的函数类型来实现。下面的例子定义了两个简单的函数调用stepForward和stepBackward。stepForward函数返回一个输入值+1的结果,而stepBackward函数返回一个输入值-1的结果。这两个函数都有一个相同的(Int) -> Int类型 :
func stepForward(input: Int) -> Int {
return input +
}
func stepBackward(input: Int) -> Int {
return input -
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
var currentValue =
let moveNearerToZero = chooseStepFunction(currentValue > )
// moveNearerToZero now refers to the stepBackward() function
print("Counting to zero:")
// Counting to zero:
while currentValue != {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// 3...
// 2...
// 1...
// zero!
嵌套函数
迄今为止所有你在本章中遇到函数都是全局函数,在全局作用域中定义。其实你还可以在其他函数体中定义函数,被称为嵌套函数。嵌套函数默认对外界是隐藏的,但仍然可以通过它们包裹的函数调用和使用它。enclosing function也可以返回一个嵌套函数,以便在其他作用域中使用嵌套函数。你可以重写上面的chooseStepFunction例子使用并返回嵌套函数:
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + }
func stepBackward(input: Int) -> Int { return input - }
return backwards ? stepBackward : stepForward
}
var currentValue = -
let moveNearerToZero = chooseStepFunction(currentValue > )
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!
【Swift学习】Swift编程之旅---函数(十)的更多相关文章
- Swift学习——Swift基础具体解释(一)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/34807025 注:由于基础部分在Swi ...
- swift学习初步(四)-- 函数
好了,让我们开始接着前几天写的系列博客开始今天的这篇博客.在swift里面如果你需要定义一个方法的话,你需要使用关键字:func,请看下面的这段代码: func sayHello(name:Strin ...
- Swift学习——Swift解释具体的基础(六)
Optionals 可选 可选(它似乎并不如此翻译)它适用于那些值这种情况可能是空的,有两种情况一个可选:存在值并等于x,要么值不存在. 选配的概念在OC和C里面并没有.在OC中最接近的概念就是 ...
- Swift学习——Swift解释特定的基础(七)
Implicitly Unwrapped Optionals 隐式解析选项 如上所述.可选意味着常数或变量"没有值".通过可选if声明来推断是否存在值,假设有值析值. 有时候 ...
- python#父与子的编程之旅#第十四章
1. 为BankAccount 建立一个类定义.它应该有一些属性,包括账户名(一个字符串).账号(一个字符串或整数)和余额(一个浮点数),另外还要有一些方法显示余额.存钱和取钱. class Bank ...
- 【Swift学习】Swift编程之旅---闭包(十一)
闭包是可以在代码中被传递和使用的自包含功能模块,它很像c和oc中的block,和.net中的lambdasbas表达式. 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 包裹着这些常量和变量的 ...
- swift学习笔记2——函数、闭包
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift 学习(二)基础知识 (函数,闭包,ARC,柯里化,反射)
函数 func x(a:Int, b:Int) {} func x(a:Int, b:Int) -> Void {} func x(a:Int, b:Int) ->(Int,Int ...
- 《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式
原创文章,欢迎转载.转载请注明:关东升的博客 Swift 2.0中的print函数有4种重载形式: l print(_:).输出变量或常量到控制台,并且换行. l print(_:_:).输出 ...
随机推荐
- 创建寄宿在Windows服务中的WCF服务
1.创建Windows服务项目 2.Server1改名为你想要的名称,比如WinServer 3.在项目中新建一个WCF文件夹,用于存放wcf服务文件. 注:在WcfServer类的上面还要添加 [S ...
- SQL SERVER 内存学习系列(一)
最近帮客户解决发布订阅的问题时,突然遇到这样一个问题发布订阅中报下面的错误,另外执行alter table 操作时也会报错 : 问题很奇怪发布订阅和CLR有什么关系?memtoleave内存是个啥?回 ...
- 实现tip浮层
实现简单的tip浮层: html代码: <!doctype html> <html> <head> <meta charset="utf-8&quo ...
- Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...
- Intellij Idea 2016 配置Tomcat虚拟目录
默认的idea是不需要配置虚拟目录了,它完全托管项目,但是有些时候,在开发过程中,是需要以虚拟目录的形式开发,即以:http://localhost:8080/虚拟目录名/index.html 这种形 ...
- [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"
[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...
- http流请求时,被请求站点HttpContext.Current为null?
我负责运维一个短信接口站点sms.调用上游短信供应商下发短信后,他们会给我们推送发送报告.报告是类似DELIVRD.DI:9432这样的码.为了方便识别,系统里有一个报告码与其描述的关系,一开始是写死 ...
- CentOS 6.6下Redis安装配置记录
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/120.html?1455855209 在先前的文章中介绍过redis,以下 ...
- VMware Workstation cannot connect to the virtual machine 解决方案
今天 打开虚拟机 忽然遇到这个问题: VMware Workstation cannot connect to the virtual machine. Make sure you have righ ...
- KendoUI系列:DropDownList
1.基本使用 1>.创建Input <input id="dropDownList" /> <link href="@Url.Content(&q ...