import UIKit
var str = "Hello, playground"
// 函数
// 语法格式
/*
func name (参数列表) -> 返回值 {
函数实现体
}
*/
// 无参, 无返回值
func hello1(){
print("hello1")// "hello1\n"
}
// 无参, 无返回值, 等价于上面
func hello2() -> Void {
print("hello2")// "hello2\n
}
// 调用函数
hello1()
hello2()
// 有参
// 1, 关于内部参数名
// 2. 只在函数作用域内部使用的参数名
func hello3Name(name: String, name2: String) {
print("你好\(name) and \(name2)")// "你好李云飞 and 李云龙
}
// 除了第一个参数, 后面的参数在调用的时候会自动生成一个与内部参数名相同的外部参数名
// 原则上, 第一个参数的外部参数名应该写在函数名的末尾
hello3Name("李云飞", name2: "李云龙")
func hello4Name(mingzi1 name:String, mingzi2 name2: String) {
print("你好\(name) and \(name2)")
}
//hello4Name(mingzi1: <#T##String#>, mingzi2: <#T##String#>)
// 外部参数名的添加规则 在内部参数名前面声明中间使用空格隔开
hello4Name(mingzi1: "李云飞", mingzi2: "李云龙")
// 添加占位符, 去掉自动生成的外部参数名
func hello5 (name : String, _ name2: String) {
print(name + name2) // 直接拼接
print("你好\(name) and \(name2)") //
}
//hello5(<#T##name: String##String#>, <#T##name2: String##String#>)
hello5("李云飞", "李云龙")
// 可以为参数赋初始值, 调用时传参则不更改, 不传参使用初始值
func hello6 (name:String = "李云飞", name2: String = "李云龙") {
print("你好\(name) and \(name2)")
}
// 调用函数有 两个可选的
//hello6() // 第一种 不用传参
// 第二种 可以只传任意一个参数
//hello6(<#T##name: String##String#>, name2: <#T##String#>)
//hello6()
hello6("仝兴伟") // 把 李云龙 改为 仝兴伟
//hello6(name2: "老仝") // 你好李云飞 and 老仝
//****************有返回值的情况
// 返回值 直接给类型
// 无参有返回值
func byebye1()-> String {
return "bye"
}
byebye1()
// 写一个函数 传入一个字符串, 返回元音的个数和辅音的个数
func yuanYinCountAndFuYinCount(ziMuString: String) -> (Int, Int) {
var yuanYinCount = 0 // 元音计数
var fuYinCount = 0 // 辅音计数
// 遍历字符
for tmpStr in ziMuString.characters {
print(tmpStr) // (11 times)
switch tmpStr {
case "a", "e", "i", "o" , "u":
yuanYinCount++
default:
fuYinCount++
}
}
// 返回元组
return(yuanYinCount, fuYinCount) // 返回元音数量, 辅音数量
}
print(yuanYinCountAndFuYinCount("aeidshuflsj")) // 元音四个, 辅音7个
// 不确定参数个数, 传进来n个Int类型的参数 (同一类型)
// 参数个数可变
func count2 (numbers: Int...) -> Int {
var sum = 0
// 不确定个数的参数作为数组使用
for num in numbers {
sum += num;
}
return sum
}
count2(1, 3, 5, 2)
// 参数在函数体内默认是不可变的, 使用var修饰就可变了
func count3 (var a: Int, b: Int) -> Int {
// a = a + b
a++
// b++
return a // 11
}
var c = 10
c = count3(c, b:0)
c
// 用inout修饰参数, 将参数的外部变量的地址传进来从而改变外部变量的值
func changeValue (inout a: Int) {
a++
print(a) // "12\n"
}
changeValue(&c) // 传地址过去
c