美文网首页
Swift 函数与闭包

Swift 函数与闭包

作者: 張無忌 | 来源:发表于2017-12-12 14:43 被阅读19次

    最简单的函数

    首先定义一个简单的函数,这个函数只是输出一个固定的名字。

    func printName() {
        print("张三")
    }
    
    printName()
    

    向函数传递参数

    我们试着将名字定义成参数,调用者可以自己传递需要打印的名字。

    func printName(name: String) {
        print(name)
    }
    
    printName(name: "张三")
    

    函数参数的两种不同名称

    定义一个可以输出名字和年龄的函数。

    func printNameAndAge2(name: String, age: Int) {
        print("name: " + name + " age: \(age)")
    }
    

    在 Swift 中,函数的参数其实有两个名字,一个叫做argument name,用于内部使用,一个叫做argument label,用于外部调用。例如,定一个可以输出名字和年龄的函数。

    func printNameAndAge(hisName name: String, andAge age: Int) {
        print("name: " + name + " age: \(age)")
    }
    
    // 调用
    printNameAndAge(hisName: "张三", andAge: 22)
    

    很明显,参数hisNameandAgeargument label,用于外部调用。为的是使函数在调用的时候,呈现更好的语义。
    参数nameageargument name,用于函数内部使用。为了让函数在实现的时候,呈现更好的实现逻辑

    调用时省略函数参数

    其实在平时的开发过程中,很少去这样定义函数,一般都是写一个函数外部和内部都通用的名字。例如:

    func printNameAndAge(name: String, age: Int) {
        print("name: " + name + " age: \(age)")
    }
    
    printNameAndAge(name: "张三", age: 22)
    

    这时,函数的argument label就等同于argument name

    也可以再简化下函数,省略掉函数的argument name,例如:

    func printNameAndAge(_ name: String, _ age: Int) {
        print("name: " + name + " age: \(age)")
    }
    
    printNameAndAge("张三", 22)
    

    因为函数名字已经很清楚得表达了要打印名字和年龄,所以参数可以省略。实际开发中,参数名省略与否要根据函数名是否清晰地表达了它所需的参数来定。

    设定默认值

    可以为函数的参数设定默认值,我们设置默认的名字为Guest

    func printNameAndAge(name: String = "Guest", age: Int) {
        print("name: " + name + " age: \(age)")
    }
    

    调用函数时,我们可以看到 Xcode 自动为我们提供了函数的两种调用,可以不传递名字。


    可变长的参数

    计算所有参数的总和。

    func addInt(_ numbers: Int ...) {
        var sum = 0
        numbers.forEach {
            sum += $0
        }
        print(sum)
    }
    
    addInt(1, 2, 3)
    

    inout 关键字

    在 C 语言时代,我们经常把一个变量带到函数里面去,期望函数把数据加工的结果返回到这个变量里,再带出来供我们使用。例如,计算两个数相加。

    func add(x: Int, y: Int, result: Int) {
        result = x + y
    }
    

    很可惜,报错了,因为result作为参数,是属于一个常量let。我们需要在参数类型前面加上inout关键字,而且注意在调用的时候,为参数加上取地址符号&。

    不过一般是实际开发中,很少这样去用,为函数制定返回值即可,例如:

    func add(x: Int, y: Int, result: Int) -> Int {
        return x + y
    }
    

    相关文章

      网友评论

          本文标题:Swift 函数与闭包

          本文链接:https://www.haomeiwen.com/subject/omugixtx.html