Swift—函数

* 函数是用来完成特定任务的独立的代码块。你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数

* 格式:

* func 函数名称(参数名:参数类型, 参数名:参数类型...) -> 函数返回值 {函数实现部分}

*没有参数没有返回值*

* 可以写为 ->Void

* 可以写为 ->()

* 可以省略

* Void 它其实是一个空的元组(tuple),没有任何元素,可以写成()

func say() -> Void{

'' print("cool")

}

say() //调用方法

func say2() -> (){

'' print("cool")

}

say2() //调用方法

func say3(){

'' print("cool")

}

say3() //调用方法

*有参数没有返回值*

* 内部参数: Swift2.0以前, 默认情况下的参数都是内部参数

*  Swift2.0开始, 默认将第二个参数名称作为外部参数

* 外部参数只能外部用, 函数内部不能使用, 函数内部只能使用内部参数

* 忽略外部参数: 在内部参数前加‘ _ ’

func sum(a: Int, b: Int){

'' print(a + b)

}

sum(10, b: 20)

func summ(a: Int, _ b: Int){

'' print(a + b)

}

summ(10, 20)

// xy外部参数, ab内部参数

// Swift2.0以前可以写#

func sum2(x a: Int, y b: Int){

'' print(a + b)

}

sum2(x: 10, y: 20)

*默认参数*

* 格式: func method(parameter: Int = 0){}

* 当默认值被定义后,调用这个函数时可以忽略这个参数

* 其它语言的默认参数必须写在最后面, Swift可以写在任意位置

* 注意:

* 将带有默认值的参数放在函数参数列表的最后。这样可以保证在函数调用时,非默认参数的顺序是一致的,同时使得相同的函数在不同情况下调用时显得更为清晰。

func joinString(s1:String , jioner:String = "❤️",toString s2:String) ->String

{

'' return s1 + jioner + s2;

}

joinString("cool", jioner: "和", toString: "boy")

joinString("cool", toString: "boy")

*常量参数和变量参数(Constant and Variable Parameters)*

* 函数参数默认是常量, 在函数内部不能修改

* 如果想在函数中修改参数, 必须在参数前加上var

* 注意:

* 对变量参数所进行的修改在函数调用结束后便消失了,并且对于函数体外是不可见的。变量参数仅仅存在于函数调用的生命周期中

func swap(a:Int, b:Int)

{

'' print("交换前 a = \(a) b = \(b)")

'' let temp = a;

'' a = b; // 不能修改

'' b = temp;

'' print("交换后 a = \(a) b = \(b)")

}

func swap1(var a:Int, var b:Int)

{

'' print("交换前 a = \(a) b = \(b)")

'' let temp = a;

'' a = b;  // 可以修改, 但不会影响实参

'' b = temp;

'' print("交换后 a = \(a) b = \(b)")

}

var x = 10

var y = 20

print("交换前 a = \(x) b = \(y)")

swap1(x, b: y)

print("交换后 a = \(x) b = \(y)")

*输入输出参数(In-Out Parameters*

* 变量参数,正如上面所述,仅仅能在函数体内被更改。如果你想要一个函数可以修改参数的值,并且想要在这些修改在函数调用结束后仍然存在,那么就应该把这个参数定义为输入输出参数(In-Out Parameters)

* 定义一个输入输出参数时,在参数定义前加 inout 关键字

* 注意:

* 输入输出参数不能有默认值,而且可变参数不能用 inout 标记。如果你用 inout 标记一个参数,这个参数不能被 var 或者 let 标记。

func swap2(inout a:Int, inout b:Int)

{

'' let temp = a;

'' a = b;

'' b = temp;

}

var x1 = 10;

var y1 = 20;

print("交换前 a = \(x1) b = \(y1)")

swap2(&x1, b: &y1)

print("交换后 a = \(x1) b = \(y1)")

*可变参数(Variadic Parameters*

* 一个可变参数可以接收零个或多个值

* 如果没有变参函数 , 并且函数的参数个数又不确定那么只能写多个方法或者用将函数参数改为集合

* 格式 func method(parameter: Int...){}

* 可变参数在函数中可以当做一个数组

* 注意:

* 一个函数最多只能有一个可变参数

* 变参只能是同种类型的数据

* 变参必须指定数据类型

* 如果函数有一个或多个带默认值的参数,而且还有一个可变参数,那么把可变参数放在参数表的最后

func add(nums:Int..., other:Int) -> Int

{

'' var sum = 0;

'' for num in nums

'' {

''    sum += num

'' }

'' return sum + other

}

print(add(1, 2, 3, other: 9))// 会将9传递给第一个参数, 后面的传递给nums

没有参数有返回值

func getNumer() ->Int{

'' return 998

}

print(getNumer())

 有参数有返回值

func sum3(a: Int, b: Int) ->Int{

'' return a + b

}

print(sum3(10, b: 20))

嵌套函数

func showArray(array:\[Int])

{

'' // 嵌套函数

'' func printArray(arr:[Int])

'' {

''    for number in array

''    {

''        print("\(number), ")

''    }

'' }

'' printArray(array)

}

showArray(\[1, 3, 5, 7, 9])

* 函数类型(Function Types)*

* 函数类型作为参数类型(Function Types as Parameter Types)

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

* 嵌套函数(Nested Functions)

*提前退出*

* 像if语句一样,guard的执行取决于一个表达式的布尔值。我们可以使用guard语句来要求条件必须为真时,以执行guard语句后的代码。

* 如果guard语句的条件被满足,则在保护语句的封闭大括号结束后继续执行代码

* 任何使用了可选绑定作为条件的一部分并被分配了值的变量或常量对于剩下的保护语句出现的代码段是可用的

* 如果条件不被满足,在else分支上的代码就会被执行。

* else这个分支必须转移控制以退出guard语句出现的代码段。它可以用控制转移语句如return,break,continue或者throw做这件事

func divide(dividend: Double? , divisor: Double?) -> Double?

{

'' if dividend == .None {

''    return .None

'' }

''

'' if divisor == .None {

''    return .None

'' }

''

'' if divisor == 0 {

''    return .None

'' }

'' // 应该尽量避免使用强制解包

'' return dividend! / divisor!

}

print(divide(10, divisor: 20))

func divide2(dividend: Double?, divisor: Double?) -> Double? {

'' // 嵌套太深

'' if let dividend = dividend

'' {

''    if let divisor = divisor

''    {

''        if divisor != 0

''        {

''            return dividend / divisor

''        }

''    }

'' }

'' return .None

}

print(divide2(10, divisor: 20))

func divide3(dividend: Double?, divisor: Double?) -> Double? {

'' guard let dividend = dividend else {

''    return .None

'' }

'' guard let divisor = divisor else {

''    return .None

'' }

'' guard divisor != 0 else {

''    return .None

'' }

'' return dividend / divisor

}

print(divide3(10, divisor: 20))

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

推荐阅读更多精彩内容

  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,806评论 0 6
  • 函数是用来完成特定任务的独立的代码块。可以给函数起一个名字,用于标识一个函数,当函数需要执行的时候,这个名字就会用...
    EndEvent阅读 732评论 1 3
  • Swift 函数用来完成特定任务的独立的代码块。Swift使用一个统一的语法来表示简单的C语言风格的函数到复杂的O...
    零度_不结冰阅读 311评论 0 0
  • 从宣告收买失利到成功出资珠海银隆,董明珠仅用了一个月的时刻,她带着首富父亲王健林和京东刘强东强势回归,而这一次,董...
    liduoduo35阅读 218评论 0 0
  • 崔荣宰×bambam 友情向。 - [我要结婚了。] 崔荣宰呆呆地看着屏幕上的五个字,愣了五秒钟,然后兴奋地蹦了起...
    7essie阅读 329评论 0 0