参数
外部变量名
一般情况下你可以不指定外部变量名,直接调用函数:
func helloWithName(name: String, age: Int, location: String) {
println("Hello \(name). I live in \(location) too. When is your \(age + 1)th birthday?")
}
helloWithName("Mr. Roboto", 5, "San Francisco")
</div>
但是在类 (或者结构、枚举) 中的时候,会自动分配外部变量名 (第一个除外) ,这时候如果还想直接调用就会报错了:
class MyFunClass {
func helloWithName(name: String, age: Int, location: String) {
println("Hello \(name). I live in \(location) too. When is your \(age + 1)th birthday?")
}
}
let myFunClass = MyFunClass()
myFunClass.helloWithName("Mr. Roboto", 5, "San Francisco")
</div>
如果你怀念在 OC 中定义函数名的方式,可以继续这样定义,比如 helloWithName 这种,隐藏第一个函数的外部名:
class MyFunClass {
func helloWithName(name: String, age: Int, location: String) {
println("Hello \(name). I live in \(location) too. When is your \(age + 1)th birthday?")
}
}
let myFunClass = MyFunClass()
myFunClass.helloWithName("Mr. Roboto", age: 5, location: "San Francisco")
</div>
如果你实在不想要外部变量名,那么可以用 _ 来代替:
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
init(_ celsius: Double) {
temperatureInCelsius = celsius
}
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius 是 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius 是 0.0
let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius 是 37.0
</div>
对外部参数名的娴熟应用可以极好的抽象初始化过程。可以看看 json-swift library 中的应用。
默认参数值
可以在函数定义里写上函数的默认值,这样在调用的时候可以不传这个值:
func add(value1 v1:Int, value2 p1:Int = 2) -> Int{
return v1 + p1
}
add(value1: 2, value2: 4) // 2 + 4
add(value1: 1) // 1 + 2
</div>
如果你没有提供外部参数名,设置默认参数值会自动提供默认参数名。
可变参数
可变参数 (Variadic Parameters) 可以接受一个以上的参数值。比如计算平均数:
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers { // numbers is [Double]
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
arithmeticMean(3, 8, 19)
</div>
如果不止一个参数,需要把可变参数放在最后,否则会报错。应该这样:
func sumAddValue(addValue:Int=0, numbers: Int...) -> Int {
var sum = 0
for number in numbers { // numbers === [Int]
sum += number + addValue
}
return sum
}
sumAddValue(addValue: 2, 2,4,5) // (2+2) + (4+2) + (5+2) = 17
</div>
常量和变量参数
默认参数是常量,无法在函数体中改变参数值。我们可以 var 一个新的值就行操作,也可以直接在函数定义中加上 var 避免在函数体中定义新的变量。
比如这一个右对齐函数:
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, "-") // "-----hello"
</div>
输入输出参数 (inout)
在函数体中对变量参数进行的修改并不会改变参数值本身,比如看这个例子:
func add(var v1:Int) -> Int {
return ++v1
}
var a = 1
add(a) // 2
a // 1
</div>
如果想通过函数修改原始值需要 inout ,但是这样是错误的:
func add(inout v1:Int) -> Int {
return ++v1
}
var a = 1
add(a) // 2
a // 1
</div>
在传入的时