Swift 3函数学习

纯粹记录一下自己学习函数这一块的内容,看官注意,没有干货
最简单的hello函数(没有参数,没有返回值)

func sayHello(){
    print("hello word!!")
}

有参数没有返回值的函数


func sayHello(name:String){
    print(name + "say hello word!! ")
}
//参数是数组的情况(两种写法都可以)
func parameterIsArray(art:[String]) {  
//do something 
}

func parameterIsArray(ary:Array<String>) {
    //do something
}
//参数是字典的情况(两种写法都可以)
func parameterIsDictionaty(dictionary:Dictionary<String, AnyObject>) {
    //do something
}

func parameterIsDictionaty(dictionary:[String:AnyObject]) {
    //do something
}

如果传入的参数可以为空(也就是可以为nil),可以用可选参数(默认的不是可选的)

func sayHello(name:String?){
    if let name1 = name {//判断name是不是为空
        print(name1 + "say hello word!! ")
    }
}

有参数有返回值的(不是可选的单一的返回值)

func add2Nuber(a:Int, b:Int) -> Int{
    return a + b
}

返回值可以是nil的函数

func add2Nuber(a:Int, b:Int) -> Int?{
    if a + b < 10 {
        return nil
    }else{
        return a + b
    }
}

返回值是元组的函数

func getData(url:String) -> (data:Data?, error:Error?){
    //write getData code
    return (nil, nil)//注意这里不能返回nil,如果?写到元组外边可以返回nil,具体可以参照上边的函数写法
}

参数有默认值的情况(注意,默认参数要放在必须参数之后)

func sayHello(name:String, greeting:String = "Hello") -> String{
    return greeting + " " + name
}

调用的时候,可以不用写greeting这个参数,不写就赋值的默认值

sayHello(name: "mike")//输出是 Hello mike

可变参数,类似系统的max函数

max(<#T##x: Comparable##Comparable#>, <#T##y: Comparable##Comparable#>, <#T##z: Comparable##Comparable#>, <#T##rest: Comparable...##Comparable#>)

这个函数可以求出很多参数的最大值,具体的参数个数,根据你输入的多少来确定,我们现在自己定义一个这样的函数,数字求和

func addSomeNumber(a:Int, b:Int, more:Int ...) -> Int {
    var result = a + b
    for number in more {
        result += number
    }
        return result
}

调用的时候可以就是这样

addSomeNumber(a: 1, b: 2, more: 3, 4 ,5 ,6, 7)

注意,可变参数只能有一个,也只能放在参数列表的最后,所以,参数,默认参数,可变参数的顺序就知道了吧(1参数2默认参数3可变参数)
------------分割线-----------
再来讨论一下外部参数名和内部参数名,所谓外部参数名,就是调用函数的时候显示出来的参数名字,内部参数就是函数内部用的参数,不会在调用的时候显示出来,来个例子

func sayHello(name:String, greeting:String){
}

调用的时候看起来是这样的

sayHello(name:"mike", greeting:"hello")//name外部是可以看到的,这也是苹果默认的情况,

如果你想有一个更好的外部参数名,可以这样

func sayHello(userName name:String, greetWrod greeting:String){
      //函数内部处理用的是name和greeting,前边的那两个只是为了外边看的
}

如果调用的时候,不想有外部参数名或者一些要一些不要,可以这样

func sayHello(_ name:String, greeting:String){
}

这样调用看起来是这样(有下横线的不会显示为外部参数名)

sayHello("mike", greeting: "hello")

如果你想用参数来做一些处理,比如

func to2(num:Int){
    num /= 2
}

这样是会报错的,原因就是默认的num是let类型,常量参数是不能改变的,如果你在num前边加上一个var,在3.0之前,貌似是可以的但是,3.0之后就不行了,你可以这样写

func to2(num:Int){
    var num1 = num
    num1 /= 2
}

如果想改变传入参数的值,就需要用到inout,注意,2.x和3.x中的写法是不一样的,这里只写3.x的写法
交换传入的两个数字的值

func swap2Int(a:inout Int, b:inout Int){
    let t = a
    a = b
    b = t
}

调用的时候,要传进去的就不是值而是一个地址,这就类似C中指针做为函数参数

var a = 3, b = 4
swap2Int(a: &a, b: &b)

调用之后,a,b的值就互换了
----------------分割线--------------
函数作为参数的用法
首先明白一点,函数也是一个类型,跟基本类型一样,可以这样写

func text1(a:Int, b:Int){
}
let text2:(Int, Int) -> () = text1//如果要显式的写出text2的类型,注意返回值是必须要写的,如果是没有参数没有返回值的类型,可以这样写let text3:() -> Void

所以函数也可以做为参数进行传递
现在有两个函数

func findBig(a:Int, b:Int) -> Int{
    return a > b ? a : b
}

func findSmall(a:Int, b:Int) -> Int{
    return a > b ? b : a
}

现在写一个函数,根据传入的是findBig还是findSmall来决定执行的结果

func find(a:Int, b:Int, rule:(Int, Int) -> (Int)) -> Int{
    return rule(a, b)
}

调用的时候,可以这样

find(a: 3, b: 4, rule: findBig(a:b:))//这里也可以传入findSmall,就是找出两个数字小的那一个

那既然函数是一个类型,也必然可以作为返回值来使用,来个例子
两个函数都是计算税收的

func tax1(wage:CGFloat) -> CGFloat{
        return 0.15 * wage
}
func tax2(wage:CGFloat) -> CGFloat{
        return 0.2 * wage
}
func choseTaxFunction(wage:CGFloat) -> (CGFloat) -> CGFloat {
        return wage <= 10000 ? tax1 : tax2
}

最后来一个计算税收的函数

func getTax(wage:CGFloat) -> CGFloat{
    let getFunc = taxFunc(wage: wage)
    return getFunc(wage)
}

总结一下函数最为参数和返回值的情况
作为参数,是已经知道要调用什么规则来处理数据。作为返回值,是根据数据来确定调用那一个处理方法。
稍微提一下函数嵌套,即使一个函数里可以再写一个函数,不会暴露在父函数之外,例如上边的例子可以这样写

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

推荐阅读更多精彩内容