Swift(五)函数

更新:2018.05.24

整理了一下demo:SwiftDemo


  • 函数是一个组织在一起的程序代码集合,用来完成某一个特定的功能。
  • Swift使用关键字`func进行函数的定义。
  • 定义一个函数时,可以定义一个或多个不同名称、类型的值,作为函数的输入参数。当函数完成是,将返回出书定义的类型。
  • 每个函数都有一个函数名来描述它的功能。通过函数名以及对应类型的参数值,可以调用这个函数,函数的参数传递顺序必须与参数列表中的顺序相同。

函数格式如下:

func 函数名(参数变量: 类型, 参数变量: 类型) -> 返回类型 {
        
    }
  • 没有参数也没有返回值
func buildSubviews() {
       
}
  • 有参数没有返回值
func tableView(tableView: UITableView) {
        
}
  • 没有参数有返回值
func buildHeaderView() -> UIView {
      
    }
  • 有参数有返回值
func sum(num1: Int, num2: Int) -> Int {
      
}

当调用包含多个参数的函数时,必须要传递形同数量的参数。

为参数设置默认值

  • Swfit中,可以为函数的参数设置默认值。
func sum (x:Int = 1, y:Int = 2) -> Int { 
    return x+y
}

在开发中,有的时候就会遇到需要默认值的函数,如上,等号后面的就是默认值。当函数中有一个传入参数没有传入时,就会采用默认值。

设置可变的参数数量

  • 定义函数时,如果不能确定传入参数的数量,可通过变量类型后面加入...定义变量参数。
  • 一个函数最多能有一个变量参数,且必须是函数表中的最后一个。
  • 一个函数如果有一个或多个参数,变量参数一定放在最后。
    func mean (numbers:Double...) -> Double {
        if numbers.count==0 {
            return 0.0
        } else {
            var temp :Double = 0
            for number in numbers {
                
                temp += number
            }
            return temp/Double(numbers.count)
        }
    }

这是一个求 Double类型平均值的函数,第二、三行代码是为了防止没有传入参数导致程序崩溃。
下面是for循环累加除参数数量,求平均值。

函数作为参数和返回类型

  • 函数作为参数
    func smaller (num1:Int, num2:Int) -> Int {
        return(num1 > num2) ? num2 : num1
    }
    func bigger (num1:Int, num2:Int) -> Int {
        return(num1 > num2) ? num1 : num2
    }
    
    func printMathResult(mathFunction:(Int,Int)->Int,num1:Int,num2:Int) {
        print("The result is \(mathFunction(num1,num2))" + ".")
    }

这里是三个函数:

  • 第一个函数是求最小值 函数的类型是(Int,Int)->Int
  • 第二个函数是求最大值 函数的类型是(Int,Int)->Int
  • 第三个函数是把mathFunction作为一个参数传入,参数类型是 (Int,Int)->Int,该函数的另外两个参数是Int,即这个函数的功能是把后两个传入参数通过matchFunction这个作为传入参数的函数进行计算,然后输出。而matchFunction这个函数做怎样的操作,就需我们传入了。这也是我们为什么要写第一个和第二个函数的目的。
printMathResult(mathFunction: smaller(num1:num2:), num1: 1, num2: 2)
printMathResult(mathFunction: bigger(num1:num2:), num1: 2, num2: 3)
  • 函数作为返回类型
    func smaller (num1:Int, num2:Int) -> Int {
        return(num1 > num2) ? num2 : num1
    }
    func bigger (num1:Int, num2:Int) -> Int {
        return(num1 > num2) ? num1 : num2
    }
    func chooseFunction(big:Bool) ->(Int,Int)->Int {
        return big ? bigger : smaller
    }

前两个函数还是上面的两个,求最大值和最小值。
只是这一次它们在第三个函数中作为返回参数存在。
如果输入的big是true的话,就返回求最大值的函数,反之返回求最小值的函数。
然后我们可以在viewDidLoad()或其他地方进行一些操作

        let function = chooseFunction(big: true)
        print(function(2,4))

我们定义了一个常量,并根据传入函数的的参数值为truebigger函数赋予function常量。


function的返回值是(Int,Int)->Int

嵌套函数

接着上面的例子,来搞一个嵌套函数
嵌套函数,顾名思义就是在函数中有另外一个函数。函数里面的函数只在本函数中有作用。

    func chooseNumber(big:Bool,number1:Int,number2:Int) {
      
        func getSmaller() {
            print((number1>number2) ? number2 : number1)
        }
        
        func getBigger() {
            print((number1>number2) ? number1 : number2)
        }
        
        big ? getBigger() : getSmaller()
        
    }

这个函数表示,在chooseNumber函数中,有两个函数即打印最大值函数getBigger 和打印最小值函数getSmaller,由传入的Bool来控制调用哪个函数输出数值。
并且,getBiggergetSmaller只能在函数chooseNumber中使用。

函数的输入输出参数

  • 如果想要一个函数可以修改参数的值,并且这些修改在函数结束之后仍然存在,那就可以将参数定义为输入输出参数,这可以通过在参数类型的前面加入inout关键字来实现。
  • 同时,传入函数的参数,只能是变量,不能是常量,当传入的参数作为输入输出参数时,需要在前面加上&符号,表示这个参数值是可以被修改的。

比如交换两个传入参数的值

    func swap(num1: inout Int, num2: inout Int) {
        let temp = num1
        num1 = num2
        num2 = temp
    }
        
        var number1 = 2
        var number2 = 3
        swap(num1: &number1, num2: &number2)
        print(number1)
        print(number2) 

常用的内置函数

Swift包含众多的内置函数,这里只介绍几个常用的,

  • abs绝对值函数
print(abs(-1))

输出结果为1

  • min最小值函数
print(min(3,4,1))

输出结果为1

  • max最大值函数
print(max(2,5,3,1))

输出结果为5

  • filter函数

filter函数用于查找在数组元素中,满足指定条件的元素,例如查数组中1~10能被3整除的数字。

        let numbers = [1,2,3,4,5,6,7,8,9,10]
        
        for i in numbers.filter({$0%3==0}) {
            print(i)
        }

$0表示忽略了参数名,而使用默认参数为$0
输出结果为:

3
6
9
  • map函数

map函数通常用于将数组中的每个元素,通过指定的方法进行转换。例如将数组中的每个整数都成3:

        let numbers = [1,2,3,4,5,6,7,8,9,10]
        
        for i in numbers.map({$0*3}) {
            print(i)
        }

输出结果为:

3
6
9
12
15
18
21
24
27
30
  • reduce函数

reduce函数可以把数组元素组合计算为一个值,比如将数组中每个数字进行加法计算,获得元素之和。

        let numbers = [1,2,3,4,5,6,7,8,9,10]
        let sum = numbers.reduce(0, {$0+$1})
        print(sum)

第一个参数为初始值,这里设置初始值为0了,就是将 0,1...到10依次相加。
也可以这样写

        let sum2 = numbers.reduce(0, +)
        print(sum2)

省略到上面的闭包。

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

推荐阅读更多精彩内容