// Playground - noun: a place where people can playimport UIKit//=================================================================//函数//// func 函数名 (参数列表) -> 返回类型 {// 代码块// }func sayHi(name: String) -> String { return "Hi, " + name}var letter = "aeibcd1234"//a i b//e c d//数字func countLetter(letter: String) -> (Int, Int, Int) { var aib = 0 var ecd = 0 var num = 0 for c in letter.lowercaseString { switch c { case "a", "i", "b": aib++ case "e", "c", "d": ecd++ default: num++ } } return (aib, ecd, num)}countLetter(letter)//=================================================================//函数类型的变量//有点类似之前学过的函数指针var funcType: String -> String = sayHifuncType("蓝鸥")func sayBye(name: String) -> String { return "Bye! " + name}funcType = sayByefuncType("蓝鸥")//参数没有名字,我们需要添加一个外部形参//1.在参数前加一个外部形参名 注:不能在函数中使用外部形参名//2.在参数名前加 #func personInfo(name personName: String, #sex: String, _age: String = "18") -> String { return personName + " " + sex + " " + _age}personInfo(name: "隔壁老王", sex: "男")//可变参数, 都是相同类型的参数func sum(numbers: Float...) -> Float { var sum: Float = 0.0 for number in numbers { sum += number } return sum}sum(1.0, 2.0, 3.0, 4.0, 5.0)//如果需要用到参数运算(修改参数的值), 需要在此之前加var修饰func hanshu(var a: Int, b: Int) { a += 3}var number = 5var number1 = 5var number2 = 3// inout关键字: 如果说我们改变传递的值,则需要用inout修饰变量//传递参数的时候,需要用&func swap(inout number1: Int, inout number2: Int) { var temp = number1 number1 = number2 number2 = temp}swap(&number1, &number2)number1number2func sixPlus(price: Float) -> Float { return price * 0.8}//函数类型作为返回值//隐藏掉 不希望被人能看到内部的方法func changeValue(plus: Bool) -> Int -> Int { func plusOne(number: Int) -> Int { return number + 1 } func minusOne(number: Int) -> Int { return number - 1 } return plus ? plusOne : minusOne}changeValue(true)var cc: Int -> Int = changeValue(false)cc(20)//=============================================================//闭包//闭包跟OC的block一样//用法//{// (参数列表)->返回值 in// 闭包的实现//{var names = ["Qiaoming", "kan", "taobao"]var sortedNames1:() = sort(&names, { (stringA: String, stringB: String) -> Bool in return stringA > stringB})names//去掉类型,通过类型推断自动获取类型//单行可以去掉returnvar sortednames2:() = sort(&names, { (s1, s2) -> Bool in s1 < s2})names//---------------------------------------var sortesNames3:() = sort(&names, { return $0 > $1})// $0表示第一个数 $1表示第二个数names//---------------------------------------var sortesNames4:() = sort(&names, <)names//---------------------------------------sort(&names) { (s1, s2) -> Bool in return s1 > s2}names//=====================================================================//类 结构体/** 相同点: 1.都可以定义属性 2.都可以定义方法,这是swift跟oc的明显的区别之一 3.都可以定义构造器(初始化方法) 4.都可以遵循协议 5.都可以被扩展 不同点: 1.类可以继承,而结构体不能 2.类可以被类型推断 3.类可以通过析构释放内存 4.类他是引用类型,结构体是值类型*/