Swift学习—教程学习五 函数(function)

5 函数(Functions)

函数是用来完成特定任务的独立的代码块。

5.1 定义与调用Defining and Calling Functions

函数名(参数列表)->返回值 {

函数体(要干什么)

}

函数名用来描述其要完成的任务,调用函数时要向函数传递其要求的输入参数,参数顺序必须与函数参数列表一致。

func greet(person: String) -> String {

let greeting = "Hello, " + person + "!"

return greeting

}

print(greet(person: "Anna")) //  3.0带标签

// Prints "Hello, Anna!"

print(greet(person: "Brian"))

// Prints "Hello, Brian!"

func greetAgain(person: String) -> String {

return "Hello again, " + personName + "!"

}

print(greetAgain("Anna"))

5.2 函数参数与返回值Function Parameters and Return Values

无参数函数Functions Without Parameters

func sayHelloWorld() ->  String {  //虽然没有参数,但括号不能少

return "hello, world"

}

print(sayHelloWorld())

// Prints "hello, world"

多参数函数Functions With Multiple Parameters

func greet(person: String , alreadyGreeted: Bool ) -> String {

//多个参数用逗号分开

if alreadyGreeted {

return greetAgain(person)

} else {

return greet(person)

}

}

print(sayHello("Tim", alreadyGreeted: true))

// Prints "Hello again, Tim!"

无返回值函数Functions Without Return Values

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

多返回值函数Functions with Multiple Return Values

可以使用元组(tuple type)作为返回类型用于返回多个值。

func minMax(array: [Int]) -> (min: Int , max: Int) {

var currentMin = array[0]

var currentMax = array[0]

for value in array[1..<array.count] {

if value < currentMin {

currentMin = value

} else if value > currentMax {

currentMax = value

}

}

return (currentMin, currentMax)

}

可以使用dot syntax的访问函数定义中返回值的min and max

let bounds = minMax([8, -6, 2, 109, 3, 71])

print("min is \(bounds.min) and max is \(bounds.max)")

// Prints "min is -6 and max is 109"

函数体中返回值的 tuple’s members不必命名,因为在定义中已命名。

可选元组返回类型Optional Tuple Return Types

如果返回元组类型有可能为空,则使用可空元组optional tuple 如(Int, Int)? or (String, Int, Bool)?.

func minMax(array: [Int]) -> (min: Int , max: Int )? {

if array.isEmpty { return nil }

var currentMin = array[0]

var currentMax = array[0]

for value in array[1..<array.count] {

if value < currentMin {

currentMin = value

} else if value > currentMax {

currentMax = value

}

}

return (currentMin, currentMax)

}

if let bounds = minMax([8, -6, 2, 109, 3, 71]) {

print("min is \(bounds.min) and max is \(bounds.max)")

}

// Prints "min is -6 and max is 109"

重载Overloading

func say()     ->    String   {

return   "one"

}

func say()     ->    Int   {

return   1

}

But now you can’t call say like this:

let     result    =     say()     //     compile       error

The call is ambiguous. The call must      be used in a context where the expected return type is clear.

let     result    =     say()     +     "two"

5.3函数参数标签和参数名Function Argument Labels and Parameter Names

每个参数都有标签和参数名,标签在调用函数时放在参数前,增加代码可读性,参数名用于函数体。一般情况下,参数使用参数名作为标签。参数名必须是独一无二的。尽管多个参数可以有相同的参数标签,但不同的参数标签能让你的代码更有可读性。

【参数标签使得参数的作用更明确,并用于区分不同的函数(名称和签名都相同但参数标签不同),更重要的是与Cocoa保持一致】

func someFunction(firstParameterName: Int, secondParameterName: Int) {

// In the function body, firstParameterName and secondParameterName

// refer to the argument values for the first and second parameters.

}

someFunction(firstParameterName: 1, secondParameterName: 2)

Func repeatString(s:String, times:Int)   ->    String {

var  result     =     ""

for  _     in    1…times { result += s }

return     result

}

let  s      =     repeatString("hi",       times:3)

指定参数标签Specifying Argument Labels

func someFunction(argumentLabel parameterName: Int) {

// In the function body, parameterName refers to the argument value

// for that parameter.

}//如果指定了标签,调用时必须带标签

func greet(person: String, from hometown: String) -> String {

return "Hello \(person)! Glad you could visit from \(hometown)."

}

print(greet(person: "Bill", from: "Cupertino"))

// Prints "Hello Bill! Glad you could visit from Cupertino."

func sayHello(to person: String , and anotherPerson: String ) ->  String  {

return "Hello \(person) and \(anotherPerson)!"

}

print(sayHello(to: "Bill", and: "Ted"))

// Prints "Hello Bill and Ted!"

省略参数标签Omitting Argument Labels

用 underscore (_) 省略参数标签。也可以用下划线省略参数名,这样,该参数在函数体内不能调用。

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {

// function body goes here

// firstParameterName and secondParameterName refer to

// the argument values for the first and second parameters

}

默认参数值Default Parameter Values

可以为参数设置默认值,设置默认值后调用时可以省略该参数。设置默认值的参数放在列表最后。

func someFunction(parameterWithDefault: Int = 12) {

// function body goes here

// if no arguments are passed to the function call,

// value of parameterWithDefault is 12

}

someFunction(6) // parameterWithDefault is 6

someFunction() // parameterWithDefault is 12

可变参数Variadic Parameters

接受零个或多个指定类型的参数.函数只能有一个可变参数。

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

var total: Double = 0

for number in numbers {

total += number

}

return total / Double(numbers.count)

}

arithmeticMean(1, 2, 3, 4, 5)

// returns 3.0, which is the arithmetic mean of these five numbers

arithmeticMean(3, 8.25, 18.75)

// returns 10.0, which is the arithmetic mean of these three numbers

输入输出参数In-Out Parameters

函数参数默认是常量。试图在函数体内改变这些参数的值将出现编译错误。这可以防止对调用参数的误修改。如果想要函数能修改传递来的参数的值,并在函数调用结束后保持这种修改,将参数作为in-out 参数。

被传递的in-out参数必须是变量,且不能设置默认值,也不能是可变参数,调用时在参数名前加&

func swapTwoInts(inout a: Int, inout _ b: Int) {//3.0改为(_ a: inout Int, _ b: inout Int)

let temporaryA = a

a = b

b = temporaryA

}

var a = 5;var b = 20;swapTwoInts(&a,&b);print("a= \(a); b= \(b)")//a=20;b=5

5.4 函数类型Function Types

每个函数都有特定类型,由参数类型和返回类型构成。It is the signature of a function.

func addTwoInts(a: Int, _ b: Int) -> Int {

return a + b

}

func multiplyTwoInts(a: Int, _ b: Int) ->  Int {

return a * b

}

这两个函数的类型(Int, Int) -> Int.

funcprintHelloWorld() {

print("hello, world")

}

该函数的类型() -> Void, (() -> (),Void -> Void)

使用函数类型Using Function Types

函数可以赋值给一个变量、作为函数参数或函数返回值。

函数类型作为参数类型Function Types as Parameter Types

func printMathResult(mathFunction: (Int, Int) -> Int , _ a: Int, _ b: Int) {

print("Result: \(mathFunction(a, b))")

}

printMathResult(addTwoInts, 3, 5)

// Prints "Result: 8"

func doThis(f:()->()) {  f() }

func whatToDo() {         print("I did it") }

doThis(whatToDo)// Prints " I did it "

func countDownFrom(ix:Int) {

print(ix)

if ix    > 0 { // stopper

countDownFrom(ix-1)//recurse!

}

}

countDownFrom(10)

函数类型作为返回类型Function Types as Return Types

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)

// moveNearerToZero now refers to the stepBackward() function

print("Counting to zero:")

// Counting to zero:

while currentValue != 0 {

print("\(currentValue)... ")

currentValue = moveNearerToZero(currentValue)

}

print("zero!") // 3...  // 2...    // 1...             // zero!

5.5 嵌套函数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)

// moveNearerToZero now refers to the nested stepForward() function

while currentValue != 0 {

print("\(currentValue)... ")

currentValue = moveNearerToZero(currentValue)

}

print("zero!")            // -4...           // -3...           // -2...            // -1...            // zero!

时间: 2024-10-11 07:13:42

Swift学习—教程学习五 函数(function)的相关文章

javascript 学习总结(五)Function对象

1.Function  函数调用(类似call方法) function callSomeFunction(someFunction, someArgument){ return someFunction(someArgument); } function add10(num){ return num + 10; } var result1 = callSomeFunction(add10, 10);//调用add10 把参数10传给add10 alert(result1); //20 funct

C++基础学习教程(五)

这一讲我们集中解说类和他的一些特性.首先我们从自己定义一个有理数类来開始. 在C语言中有一个keyword: struct ,用来创建一个结构体类型.可是在C++中这个关键的含义就不只如此了,以下我们能够看下演示样例: /// Represent a rational number. struct rational { int numerator; ///< numerator gets the sign of the rational value int denominator; ///<

JavaScript学习总结(四)function函数部分

转自:http://segmentfault.com/a/1190000000660786 概念 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. js 支持两种函数:一类是语言内部的函数(如eval() ),另一类是自己创建的. 在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域是局部的). 您可以在不同的函数中使用名称相同的局部变量,因为只有声明过该变量的函数才能识别出该变量. 函数调用 有如下四种调用js函数的方式

PostgreSQL学习手册(五) 函数和操作符

PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:    常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:    下面是PostgreSQL中提供的比较操作符列表: 操作符 描述 < 小于 > 大于 <= 小于或等于 >= 大于或等于 = 等于 != 不等于 比较操作符可以用于所有可以比较的数据类型.所有比较操作符都是双目操作符,且返回boolean类型.除了比较操作符以外,我们还可以使用BETWEEN语句,如

JavaScript学习总结(十五)——Function类

在JavaScript中,函数其实是对象,每个函数都是Function类的实例,既然函数对象,那么就具有自己的属性和方法,因此,函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 一.函数的声明 方式一:常规方式 1 function sum1(num1,num2){ 2 return num1+num2 3 } 方式二:函数表达式 1 var sum2=function(num1,num2){ 2 return num1+num2; 3 }; 方式三:动态创建函数(这种方式用得不多)

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

Mysql学习笔记(五)数学与日期时间函数

原文:Mysql学习笔记(五)数学与日期时间函数 学习内容: 1.数学函数 2.日期时间函数 这些函数都是很常用的函数...在这里进行简单的介绍... 数学函数: mysql> SELECT ABS(-32); //取绝对值函数 -> 32 这个函数可安全地使用于 BIGINT 值. mysql> SELECT SIGN(-32);//判断一个数是正数,负数,还是0..根据实际情况返回指定的数值.. -> -1 mysql> SELECT MOD(234, 10);//取模函

redis学习教程五《管道、分区》

redis学习教程五<管道.分区> 一:管道 Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户端. 管道的意义 管道的基本含义是,客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复. 示例 要检查Redis管道,只需启动Redis实例,并在终端中键入以下命令. (echo -en "PING\r\n SET t

Swift 学习笔记十五:扩展

扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).扩展和 Objective-C 中的分类(categories)类似.(不过与Objective-C不同的是,Swift 的扩展没有名字.) Swift 中的扩展可以: 1.添加计算型属性和计算静态属性 2.定义实例方法和类型方法 3.提供新的构造器 4.定义下标 5.定义和使用新的嵌套类型 6.使一个已有类型符合某个协议 一.扩展属性,构造器,方法 class Human{ var name:String? va