Swift基础语法: 21 - Swift的可变形形参, 常量形参, 变量形参, In-Out形参

1.可变形形参

在Swift中, 有一个很有趣的参数定义方式, 那就是在类型名后添加 “( … )” 这个符号, 这种定义方法, 可以让我们在调用的时候随意传递任意数量的输入值, 比如:

func arithmeticMean(numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
        return total / Double(numbers.count)
}
var a = arithmeticMean(1, 2, 3, 4, 5)
println("a is \(a)")
// 打印出来的结果: a is 3.0

var b = arithmeticMean(3, 8, 19)
println("b is \(b)")
// 打印出来的结果: b is 10.0

2.常量形参和变量形参

函数的形参默认是常量。如果在函数体内修改该形参的数值, 编译器是会报错的, 那我们应该怎么做呢? 下面让我们来看看:

func alignRight(var string: String, count: Int, pad: Character) -> String {
    let amountToPad = count - countElements(string)
    if amountToPad < 1{
        return string
    }

    let padString = String(pad)

    for _ in 1...amountToPad {
        string = padString + string
    }
    return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, 10, "-")

println(paddedString)
// 打印出来的结果: -----hello

PS: 这里面所定义的函数alignRight是用来给字符串排序用的, 而例子中的排序是从左往右的排序, 每一个新加入的字符都会往左边添加, 而这个例子里面的形参 string 前面就加了 var, 这样子我们就可以一直更新字符串的排序.


3.In-Out 形参

变量形参有一定的局限性, 变量形参所做的改变不会比调用函数更持久,并且在函数体外是不可见的, 变量形参仅存在于函数调用的声明周期中, 如果要在函数调用结束后继续保持形参值的改变, 那么就要把形参改成In-Out形参, 比如:

func swapTwoInts(inout a: Int, inout b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var someInt = 3
var anotherInt = 107

swapTwoInts(&someInt, &anotherInt)

println("someInt is now \(someInt), and anotherInt is now \(anotherInt )")
// 打印出来的结果: someInt is now 107, and anotherInt is now 3

PS: In-Out 参数不能有默认值, 可变参数的参数也不能被标记为 inout. 如果您标记参数为 inout, 它不能同时被标记为 var 或 let.

如果我们只是简简单单的用了可变形参的话, 那么出来的结果就不是如此了, 比如:

func swapTwoInts(inout a: Int, var b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var someInt = 3
var anotherInt = 107

swapTwoInts(&someInt, anotherInt)

println("someInt is now \(someInt), and anotherInt is now \(anotherInt )")
// 打印出来的结果: someInt is now 107, and anotherInt is now 107

PS: In-out 形参不同于从函数返回一个值, 上边 swapTwoInts 例子没有定义返回类型或者返回值, 但它仍然会修改 someInt 和 anotherInt 的值, 对函数来说, In-out 形 参是一个影响函数主体范围外的可选方式.


好了, 这次我们就讲到这里, 下次我们继续~

posted @ 2015-03-16 00:38  背着吉他去流浪  阅读(657)  评论(0编辑  收藏  举报