8-Swift之函数 (Func)

1、什么是函数?

函数在数学上的定义:给定一个数集A,对A施加对应法则f,记作f(A),得到另一数集B,也就是B=f(A).那么这个关系式就叫函数关系式,简称函数。

2、函数的定义

函数过程中的这些语句用于完成某些有意义的工作——通常是处理文本,控制输入或计算数值。通过在程序代码中引入函数名称和所需的参数,可在该程序中执行(或称调用)该函数。

3、常见函数举例

1》常见函数

/**

简单的函数

*/

func printValue(){

print("printValue is Start")

}

/* 调用 */

printValue()

/**

输出: getValue is Start

*/

2》带有返回值的函数

/**

带有返回值的函数

函数可以向调用它的代码返回一个值。在定义函数的时候,必须必须使用箭头符号(->) 指明返回值类型。

*/

func getValue() -> Int {

return 250

}

/* 调用 */

let value = getValue()

print(value)

/* 输出:250 */

3》带参数的函数

/**

带参数的函数

注意: 带参数的函数定义时,必须要定义这些参数的类型

*/

func sum(value:Int ,value1: Int)->Int{

return value + value1

}

/* 调用 */

let  sumValue = sum(value: 110, value1: 110)

print(sumValue)

/* 输出: 220 */

4》返回多值的函数

/**

返回多值的函数

注释: 函数返回一个值的情况,我们已经了解。但也可以通过元组的形式,让函数一次返回多个值。另外可以在元组中添加标志,一遍获取其值

*/

func getValues(name:String,age:Int)->(address:String,class:String){

let addressString = name + "is address "

let classString = String(age) + "is class"

return (addressString,classString)

}

/* 调用 */

let tuples = getValues(name: "小郑", age: 10)

print(tuples)

/*输出:(address: "小郑is address ", class: "10is class") */

/**

可以通过下标或者标签来访问数值

*/

let value1 = getValues(name: "小郑", age: 10).1

let value2 = getValues(name: "小郑", age: 10).address

print(value1 + value2)

/*输出: 10is class小郑is address */

5》带有指定名字的函数

/**

带指定名字参数的函数

注释:在定义函数的时候,可以为参数指定名字,在使用的时候,可以了解其意思

*/

func getUserInfo(Username nameString:String , UserAge  ageInt:Int){

print(nameString + "is" + String(ageInt) + "岁")

}

/* 调用 */

getUserInfo(Username: "小郑", UserAge: 250)

/* 输出:小郑is250岁 */

6》带有默认值的函数

/**

带有默认值的函数

注释: 调用这写函数的时候可以省略特定的参数

*/

func getArea(weight:Float,height:Float = 100.0){

print("面积:"+String(weight * height))

}

/* 调用 */

getArea(weight: 0.25)

/* 输出:面积:25.0  */

7》参数可变的函数

/**

参数可变的函数

注释: 一个取值数目可变的参数成为可变参数。为此可以使用三个句点(...) 表示一个参数的取值是可变的。在函数的主体内部,可变参数变成一个数组。

警告: 在使用可变参数时,可以有任意多个非可变参数。但是,只有列表中的最后一个参数可以是可变参数。

*/

func AbleParamsFunc(numbers:Int ...)->Int{

/* 其中 numbers 是一个数组*/

var sum = 0

for temp in numbers {

sum += temp

}

return sum

}

/* 调用*/

let sumValueAll = AbleParamsFunc(numbers: 1,2,3,4,5,6,7,8,9)

print(sumValueAll)

/* 输出:45 */

8》inout 关键字的函数

/**

inout 关键字

注释: inout 定义一个参数,那么就可以在函数内部改变这个参数的值。

*/

func swapValue( firstV:inout Int , secondV:inout Int){

let temp = firstV

firstV = secondV

secondV = temp

}

var swapV = 110

var swapV1 = 120

/* 调用 */

swapValue(firstV: &swapV, secondV: &swapV1)

print("swapV:",swapV,"swapV1:",swapV1)

/* 输出: swapV: 120 swapV1: 110  */

9》函数变量

/**

函数变量

注释:函数可以存储在变量中,为此,首先声明一个变量,它能够存储一个接受特定参数,返回一个值的函数。声明后,只要一个函数的参数与返回值类型都与声明中的函数相同,就可以将它存储在这个变量中。

*/

/* 定义一个函数变量*/

var funcParam:(Int,Int)->Int;

/*funcParam 就可以存储任何接受两个Int,并返回Int的函数 */

//  第一种写法:funcParam = sum  第二种写法:funcParam = sum(value:value1:)

funcParam = sum(value:value1:)

/* 调用*/

let sumValueParam = funcParam(110,110)

print(sumValueParam)

/* 输出:220 */

10》函数作为函数的参数

/**

函数作为函数的参数

注释:函数可以接受其他函数作为自己的参数,这就意味着函数可以合并。

*/

func funcSum(aNumber:Int)->Int{

return aNumber * 3

}

func funcSums(aNumber:Int,aNumberFunc:(Int)->Int)->Int{

/**

aNumberFunc:(Int)->Int 就是一个参数

*/

return aNumberFunc(aNumber)

}

/* 调用 */

/* 从传入的参数来看,这就是将函数作为参数传递进去*/

let aNumberV = funcSums(aNumber: 3, aNumberFunc: funcSum(aNumber:))

print(aNumberV)

11》函数作为返回函数

/**

函数返回函数

注释:函数可以返回函数,这就可以使用函数创建函数

*/

func createFunc(aNumber:Int)->(Int)->Int{

func adder(aNum:Int)->Int{

return aNum * aNumber

}

return adder(aNum:)

// return adder

}

/* 调用 */

let adderFunc = createFunc(aNumber: 3)

let adderV = adderFunc(4)

print(adderV)

12》生成器函数

funcmakeFunc(aNumber:Int)->()->Int{①

vartemp =0②

funcsumFunc()->Int{③

temp += aNumber④

returntemp

}

returnsumFunc⑤

}

letaNumberValue = makeFunc(aNumber:10)⑥

letnumberV = aNumberValue()⑦

print(numberV)

letnumberV1 = aNumberValue()

print(numberV1)

letaNumberValue1 = makeFunc(aNumber:15)⑧

letnumberV2 = aNumberValue1()⑨

print(numberV2)

注释:

①makeFunc函数接受一个Int参数,并返回一个函数,此函数没有参数,返回一个Int

② 在函数内部创建一个temp变量,并赋值为0

③在函数内部创建一个sumFunc的函数,没有参数,但有返回值

④ 在这个新函数的内部,aNumber作为参数,将其添加到temp,并返回temp变量

⑤ 返回sunFunc函数

⑥ 是用makeFunc创建一个递增函数,初始值为10

⑦ 每次调用makeFunc函数,它的返回值就比上一次调用增加10。因为makeFunc捕获了变量temp,每次调用它的时候就会增大。

⑧temp变量,并没有在各个函数间共享,在创建一个新的递增函数,它就会拥有新的变量

⑨第二个函数递增15

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容