import Foundation
// 函数和闭包
// 函数的定义
/*
func 函数名(参数列表) -> 返回值类型{
函数实现
}
*/
func sayHello(name: String) -> String{
return "Hello " + name
}
println(sayHello("北京"))
// 定义一个函数类型 (接收函数参数是string 返回值也是string类型的)变量可以改值
var funcType: (String -> String) = sayHello
println(funcType("海淀"))
func sayGoodBye(name: String) -> String{
return "GoodBye " + name
}
funcType = sayGoodBye
println(funcType("清河"))
// 函数的多返回值(元组)
func count(stringA: String) -> (vowels: Int, consonants: Int){
var vowels = 0
var consonants = 0 // 如果一行有两个语句用;进行分割
for character in stringA{
var string: String = String(character).lowercaseString // 转化为小写字符
switch string {
case "a", "e", "i", "o", "u":
vowels++
case "b", "c", "d", "f", "g", "h":
consonants++
default:
println("非字符")
}
}
return (vowels, consonants)
}
var letterCount = count("aeifgh23")
println("元组个数:\(letterCount.0), 辅音个数:\(letterCount.1)")
// 参数没有名字, 外部参数名称, 让开发者知道参数用来做什么
// 声明了外部参数名称, 代用的是时候必须写
// # 使内部参数名称变为内外都可以使用
func personInfo(person name: String, #sex: String) -> String{
return name + " " + sex
}
println(personInfo(person: "辉哥", sex: "男"))
// 可以指定参数的默认值, 直接在参数列表最后增加
func personInfoDetail(#name: String, #sex: String, company: String = "蓝欧 ",age: String = "18") -> String{
return name + sex + company + age
}
println(personInfoDetail(name: "辉哥 ",sex: "男 "))
println(personInfoDetail(name: "亚姐 ",sex: "女 ", company: "Apple ",age: "20")) // 默认参数系统自动的设置为外部参数, 如果不想写的话,加 _ 忽略 符号之间注意空格啊 空格敏感啊
// 可变参数(参数的个数可变, 使用...)
func meanValue(numbers: Double...) -> Double{
var sum = 0.0
for number in numbers{
sum += number
}
return sum / Double(numbers.count) // 求平均数
}
println("meanValue = \(meanValue(1.0, 2.0, 3.0, 4.0))")
// 在参数列表中可以声明var 在函数内部可以改变参数的值,不影响外部
func inArgument(var a: Int,b: Int){
a++
//b++
}
var number = 5
inArgument(number, 3)
println("number = \(number)")
// 如果想改变传递参数的值并且作用于函数外部(C语言传地址)在Swift中使用关键字 inout 传递参数的时候需要使用取地址符 &
func swapTwoInt(inout a: Int,inout b:Int){
var temp = a
a = b
b = temp
}
var valueA = 3,valueB = 5
swapTwoInt(&valueA, &valueB)
println("valueA = \(valueA),valueB = \(valueB)")
// 函数嵌套(默认是共有的 被嵌套的函数在函数外部不能访问)
func plusOne(number: Int) -> Int{
return number + 1
}
func tallyDown(number: Int) -> Int{
return number - 1
}
func changeValue(isPlusOne: Bool) -> (Int -> Int){
return isPlusOne ? plusOne : tallyDown // 返回函数类型相同
}
var changeValuePlusOne: Int -> Int = changeValue(true)
var changeValueTallyDown: Int -> Int = changeValue(false)
var value = 90
println("加一:\(changeValuePlusOne(value))")
println("减一:\(changeValueTallyDown(value))")
// 闭包
// 闭包和OC里面的blocks类似, 一段封闭的代码块, 匿名函数
/*
{
(参数列表) -> (返回值类型) in
闭包的实现
}
*/
var names = ["zhangsan", "lisi", "wangwu", "maliu"]
// 完整版
var sortedName1 = sort(names, {
(stringA: String, stringB: String) -> Bool in
return stringA > stringB
})
println("sortedName1: \(sortedName1)")
// 去掉类型推断
var sortName2 = sort(names, {
(stringA, stringB) -> Bool in
stringA > stringB // 如果闭包里只有一个语句 并且是返回值 可以去掉return
})
println("sortName2: \(sortName2)")
// 继续简化 去掉in之前的
var sortName3 = sort(names, {
$0 > $1
})
println("sortName3: \(sortName3)")
// 最减式
var sortName4 = sort(names, >) // 运算符重载
println("sortName4: \(sortName4)")
// 尾随闭包,如果函数的最后一个参数是一个闭包,那么闭包可以直接写在函数的外面
var sortName5 = sort(names){
$0 > $1
}
/*
// 在Xcode6之后, sort函数进行了更改
var sortedName1: () = sort(&names, {
})
*/