// Playground - noun: a place where people can play import 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 = sayHi funcType("蓝鸥") func sayBye(name: String) -> String { return "Bye! " + name } funcType = sayBye funcType("蓝鸥") //参数没有名字,我们需要添加一个外部形参 //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 = 5 var number1 = 5 var number2 = 3 // inout关键字: 如果说我们改变传递的值,则需要用inout修饰变量 //传递参数的时候,需要用& func swap(inout number1: Int, inout number2: Int) { var temp = number1 number1 = number2 number2 = temp } swap(&number1, &number2) number1 number2 func 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 //去掉类型,通过类型推断自动获取类型 //单行可以去掉return var 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.类他是引用类型,结构体是值类型 */