Swift: 7.1 函数基础
函数一段用来处理特定任务的自包含代码。通过给这段代码加上命名标识,就可以通过调用这个函数名字来执行这段代码。Swift的函数语法非常灵活,既可以用来表示不带参数名的简单的C样式的函数,还可以表示带局部和外部参数名的复杂的Objective-C样式的函数。
函数定义和调用
Swift中的函数的声明组成跟其他语言一样,即包含关键字、函数名、参数列表、返回值和函数体。区别在于写法上有所差别。
func sayHello(name:String) -> String {
return "Hello, " + name + "!"
}
上面两行代码定义了一个sayHello函数,以func关键字开头,参数列表以名称、类型对的方式组成,右箭头指定了函数的返回值的类型。函数定义完成后可以通过如下形式调用。
//把返回值赋给一个常量
let str = sayHello(name: "Amy")
print(str)
//直接在print函数里面调用
print(sayHello(name: "Bry"))
函数形参和返回值
- 与Objective-C类似,函数可以没有形参没有返回值,也可以有多个形参,不过,Swift函数还可以有多个返回值,多个返回值是元组的样式(x,y)。下面代码演示不同类型形参和返回值的函数。
//多个参数
func maxInt(a: Int, b: Int)-> Int{
return a > b ? a :b
}
print(maxInt(a:2,b:1)) //输出2
//无形参、无返回值
func printConst(){
print("I'm constant~")
}
printConst()
//多个返回值
func getPoint()-> (Int, Int){
return (1,1)
}
let (x,y) = getPoint()
print("(\(x),\(y))")
- Swift继承了Objective-C为参数命名外部形参名的做法,在内部形参名前面可以加一个外部调用的标识。默认的,如果不指定外部形参名,就用内部形参名进行代替。
//不指定外部形参名
func someFunction(first: Int, second: Int) {
}
someFunction(first: 1, second: 2)
//指定外部形参名 argumentLabel
func someFunction1(argumentLabel parameterName: Int) {
}
someFunction1(argumentLabel: 1)
- 可以使用下划线(_)作为占位符,来忽略外部形参名,这样在调用的时候,就可以不用在参数前面加上外部形参名。注意,如果有外部形参名,在函数调用时候必须要带上。
func someFunction(_ first: Int, second: Int) {
}
someFunction(1, second: 2)
- 与Objective-C语言类似,Swift函数还可以给函数参数设置默认值,如果设置了默认值,在函数调用的时候,可以忽略这个参数。
func someFunction(first: Int, withDefault: Int = 12) {
}
someFunction(first: 3, withDefault: 6) // withDefault的值是12
someFunction(first: 4) // withDefault 的值是 12
- 同样的,函数还可以有可变形参,也就是参数可以为0到多个相同类型的值。只要在参数名后面插入(...)即可创建可变形参。函数中最多只能有一个形参。
func sumNum(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total
}
sumNum(1, 2, 3, 4, 5)
// 返回值15是上面几个数之和
sumNum(3, 8.25, 18.75)
// 返回上面几个数的和30
- 默认情况下函数的参数都是常量,如果在函数的内部尝试着去改变形参的值的话,编译器会报错。如果想要改变形参的值的话,就在参数的前面加上inout关键字,函数调用的时候,实参的前面加上(&)符合即可,表示的是传递过去一个指针。
func swapInt(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var one = 1
var two = 2
swapInt(&one,&two)
print("现在两个值是\(one),\(two)")
//打印:现在两个值是2,1
演示示例
下面示例代码演示了函数的定义和使用,函数形参和返回值的各种用法。
func concat(_ prefix: inout String, nums:Int...)->(str:String,count:Int){
for num in nums {
prefix += String(num) + " "
}
return (prefix,nums.count)
}
var str = "Hello "
var num1 = 9
var num2 = 8
var num3 = 7
// 字符串的操作是值拷贝
var returnStr = concat(&str, nums: num1,num2,num3)
print(str) //函数外的值被函数改变
print(returnStr) //返回的元组
returnStr.str += "6" //验证字符串是值拷贝
print(str)
print(returnStr)
运行结果如下截图。