免费开源的iOS开发学习平台

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)

运行结果如下截图。

示例代码

https://github.com/99ios/23.7