接下来我再看一下,Swift高级。语法,可能会被认为是简单的、零散的,但是我们学习的重点是,将这些简单的、零散的语法熟练掌握,应用到功能的实现中去。这才是我们想要的。


招商银行科苑支行的swift_实例化






//  main.swift 
 
 //  Swift-SeniorGrammer 
 
 // 
 
 //  Created by CE on 16/7/8. 
 
 //  Copyright © 2016年 vcchou. All rightsreserved. 
 
 // 
 

 import Foundation 
 

 print("Hello, World!") 
 

 //一、函数 
 
 //1.定义函数 
 
 //无参无返回值的函数 
 
 func eat() { 
 
    print("eating") 
 
 } 
 
 //函数调用 
 
 eat() 
 

 //2.定义一个有参数无返回值的函数 
 
 //func 函数名(参数名称:参数类型。。。) 
 
 func drink(a: Int,b: Int) { 
 
     print(a +b) 
 
 } 
 
 drink(10, b: 20) 
 


 //3.定义一个有参数和返回值的函数 
 
 //func 函数名(参数名称:参数类型。。。) ->返回值类型 
 
 func relax(a: Int,b: Int) ->Int { 
 
     return a -b 
 
 } 
 
 var result1 = relax(30, b: 20) 
 
 print(result1) 
 

 //4.可以让元组作为函数的返回值 
 
 func run(a: Int,b: Int) ->(a1:Int,b1:Int) { 
 
     return (a *10,b * 10) 
 
 } 
 
 var r = run(10, b: 20) 
 
 print(r) 
 
 print(r.a1) //访问到元组里的具体元素 
 
 print(r.b1) 
 


 //5.多参量函数 
 
 //函数可以有多种不同类型的参数 
 
 //函数一 
 
 func greet(personName: String) ->String { 
 
     return"hello" + personName 
 
 } 
 
 //函数二 
 
 func greetAgain(personName: String) ->String { 
 
     return"hello again" + personName 
 
 } 
 
 //实现多参量函数 
 
 func sayHello(personName: String,alreadyGreet: Bool) ->String{ 
 
     ifalreadyGreet { 
 
        return greetAgain(personName) 
 
     } else{ 
 
        return greet(personName) 
 
     } 
 
 } 
 
 print(sayHello("尼古拉斯赵四", alreadyGreet: false)) 
 


 //6.函数的外部参数 
 
 //主要是为了指明每个参数所代表的意义 
 
 func login(userName para1: String,password para2: String) { 
 
     print("用户名是\(para1),密码是 \(para2)") 
 
 } 
 
 login(userName: "小明", password: "123") 
 

 //忽略参数 
 
 func jump(para1: String,_ para2: String) { 
 
    print("\(para1) \(para2)") 
 
 } 
 
 jump("123", "456") 
 

 //7.函数的默认参数值 
 
 func fly(a: Int,b: Int = 10) ->Int { 
 
     return a *b 
 
 } 
 
 var f = fly(20) 
 
 var f1 = fly(20, b: 30) 
 
 print(f1) 
 

 //8.定义可辨参数的函数(通过...使得函数的参数个数是动态的) 
 
 func sum(numbers: Int...) ->Int { 
 
     var result =0 
 
     for i innumbers { 
 
        result += i 
 
     } 
 
     
 
     returnresult 
 
 } 
 
 var sumResult = sum(1,3,5,2,7,4) 
 
 print(sumResult) 
 

 //9.函数的常量参数和变量参数 
 
 //默认情况下,函数的参数都是let类型 
 
 func swim(var a: Int,b: Int) ->Int { 
 
     a = a +10 
 
     returna 
 
 } 
 
 var s = swim(10, b: 0) 
 
 print(s) 
 

 //10.函数的输入输出参数 
 
 //使用inout关键字来定义函数的输入输出参数,只有变量才能作为函数的输入输出参数 
 
 func change(inout a: Int,inout b: Int) { 
 
     let temp =a 
 
     a = b 
 
     b =temp 
 
 } 
 
 var c1 = 10 
 
 var c2 = 15 
 
 change(&c1, b: &c2) 
 

 print("c1 is \(c1),c2 is \(c2)") 
 

 //11.函数类型的使用 
 
 //加法 
 
 func add(a:Int,b:Int) ->Int { 
 
     return a +b 
 
 } 
 
 //减法 
 
 func sub(a:Int,b:Int) ->Int { 
 
     return a -b 
 
 } 
 
 //共同特点是:(Int,Int) ->Int 
 
 //函数类型作为类型标注使用 
 
 var res1: (Int,Int) ->Int = add 
 
 var finalRes1 = res1(2,3) 
 
 print(finalRes1) 
 

 //函数类型作为参数类型 
 
 func hehe(a: (Int,Int) ->Int,b: Int,c: Int) ->Int { 
 
     returna(b,c) 
 
 } 
 
 var h = hehe(sub, b: 10, c: 30) 
 
 print(h) 
 

 //函数类型可以作为函数返回类型 
 
 func test(a: Int,b: Int) ->(Int,Int) ->Int { 
 
     if a + b> 10 { 
 
        return sub 
 
     } else{ 
 
        return add 
 
     } 
 
 } 
 
 var t = test(5, b: 4) 
 
 print(t(100,200)) 
 


 //二 闭包 
 

 //swift中的闭包是自包含的代码块 可以在代码块中传递和使用  类似oc中的block 
 
 //闭包可以捕捉和存储所在上下文任意的常量和变量的引用 即包裹这些常量和变量  在swift中会自动管理捕获的过程中涉及到所有的内存操作 
 

 //1.闭包表达式语法 
 
 //{(参数:参数类型……)->返回值类型 in 
 
 // 
 
 //       //执行语句 
 
 // 
 
 //} 
 


 //2.sort函数 
 
 //是系统提供的一个排序函数  用于对数组中的元素进行排序 并不会修改原来数组 
 

 let names = ["Jack","Rose","Xaioming","Zhangsan"]; 
 
 //比较大小 
 
 func prepare(para1:String,para2:String)->Bool{ 
 

     return para1< para2 
 

 } 
 

 //实际上试讲自定义的比较函数整个作为参数传递给了sort函数 
 
 var newNames = names.sort() 
 

 print(newNames) 
 

 //3.使用闭包语法写  在oc中用到block的地方 在swift中就是闭包 
 

 newNames = names.sort({(para1:String,para2:String)->Boolin 
 


 return para1 > para2 
 

 }) 
 


 print(newNames) 
 


 //4.根据上下文来推断类型 
 
 //在swift中系统可以自动的推断参数和返回值的类型 
 
 newNames = names.sort({para1,para2 in 
 

     return para1> para2 
 

 }) 
 

 print(newNames) 
 


 //5.单表达式闭包隐式返回  参数类型 return都隐藏达到隐式返回的目的  只有单行表达式时可以隐藏 
 
 newNames = names.sort({para1,para2 in 
 

     para1 >para2 
 

 }) 
 


 print(newNames) 
 



 //尾随闭包 
 



 //三、枚举 
 
 //在c中我们的枚举  将枚举名和一个整型的值相对应 在swift中枚举变得更加灵活  枚举名不再只跟整形值相对应 也不再给每个枚举名提供一个值 如果有值值的类型 可能是字符串 字符  整型 或者 浮点型 
 

 //1.定义一个枚举 
 
 //使用enum关键字 
 
 enum Direction{ 
 

    //枚举成员值 
 
     //case关键字表示新的一行 成员值将被定义 
 
     casewest 
 
     caseeast 
 
     casenorth 
 
     casesouth 
 
     
 
 } 
 


 //多个成员值可以定义在同一条语句中 用逗号隔开 
 
 enum Aniaml { 
 

     casedog,pig,cat,elephant 
 

 } 
 



 //2.使用枚举值 
 
 var direction = Direction.east 
 
 //枚举再被初次初始化之后 获取另外的值时 可以直接使用(.)调用 
 
 direction = .south 
 

 print(direction) 
 


 //3.匹配枚举值和swich语句 
 
 switch direction { 
 

 case.north: 
 
    print("north") 
 
 case.south: 
 
    print("south") 
 
     
 
 case.west: 
 
    print("west") 
 
     
 
 case.east: 
 
    print("east") 
 
     
 
 } 
 


 //四、类和结构体 
 
 //1.定义 
 
 //类 使用class关键字 
 
 class person { 
 
     //定义属性 
 
     var name ="" 
 
     var age =0 
 

 } 
 

 //结构体 是哦用struct关键字 
 
 struct student { 
 

     //定义属性 
 
     var number =20 
 
     var grade =5 
 

 } 
 

 //2.类的实例化 
 
 //person类 
 
 var per = person() 
 

 //给类的属性赋值 
 
 per.name = "张三" 
 
 per.age = 3 
 
 print("姓名:\(per.name),年龄:\(per.age)") 
 

 //student的实例化 
 
 var stu = student() 
 
 //给结构体属性进行赋值 
 
 stu.grade = 7 
 
 stu.number = 50 
 
 print("年级:\(stu.grade),人数:\(stu.number)") 
 


 //3.类和结构体的混合编程 
 


 struct Hand{ 
 

     var number =0 
 

 } 
 


 class Child { 
 
     
 
     var name ="" 
 
     var age =0 
 
    //将结构作为类型标注  当类中包含自定的类型时 需要将包含定义的类型初始化 
 
     var hands:Hand = Hand() 
 
     
 
 } 
 

 //实例化Child 
 
 var child = Child() 
 
 //属性赋值 
 
 child.name = "旺财" 
 
 child.age = 12 
 
 child.hands.number = 2; 
 
 print("小孩\(child.name),今年\(child.age)岁,有\(child.hands.number)只手") 
 


 //4.逐一构造器 
 
 //结构体具有逐一构造器 但是类没有 因为结构体是值类型 类是引用类型 
 

 struct Dog { 
 

     var name ="" 
 
     var age =0 
 

 } 
 
 //逐一构造器 实例化的同时 对属性进行赋值 
 

 var dog = Dog(name: "大黄", age: 3) 
 


 //5.值类型 
 
 //特点 当赋值给变量或常量或者函数的时候 是通过拷贝的形式 拷贝之后是两个并存独立的文件 
 
 var dog1 = dog 
 
 print(dog1.name) 
 

 dog.name = "小黄" 
 
 print(dog.name) 
 

 //6.引用类型 
 
 //类是引用类型  引用不是独立的 当引用类型给变量或常量或函数复制时 只是做了指针的指向内存中并没有拷贝 
 
 class Cat { 
 

     var name ="" 
 
     var age =0 
 

 } 
 

 var cat = Cat() 
 
 cat.name = "小猫" 
 

 var cat1 = cat 
 
 print(cat1.name) 
 

 cat.name = "大猫" 
 
 print(cat.name) 
 
 print(cat1.name) 
 


 //类和结构体的区别 
 
 //相同点 1.定义的方式是一样的  2.都有各自的属性 3.实例化的方式一样  4.属性赋值的方式也是一样的 
 

 //不同点 1.关键字不同  类class 结构体struct 2.实例化时 结构体有另外的逐一构造器 但类没有  3.结构体是值类型 类是引用类型 
 

 //联系 可以将结构体作为类型标注在类中使用 
 


 //7.实例方法和类方法的使用 
 
 class Tiger { 
 

     var name ="" 
 
     var age =0 
 
    //创建实例方法 
 
     funceat(){ 
 
     
 
        print("practice makes prfect") 
 
        //在实例方法中self表示当前类的对象 
 
        self.name  = "tiger" 
 
     } 
 
    //self还可以用来区分属性和形参 
 
     funcrun(name:String){ 
 
     
 
        self.name = name 
 
     } 
 
     //创建类方法可以通过关键字static或class关键字来标明 
 
    //在实例方法前面加上一个static或class关键字就成了类方法 
 
     static funcbark(){ 
 
         
 
        print("barking") 
 
         
 
     } 
 

 } 
 

 //调用类方法和实例方法 
 
 //实例化 
 
 var tiger = Tiger() 
 
 //调用实例化方法:通过对象的调用 
 
 tiger.eat() 
 
 //调用类方法:通过类名调用 
 
 Tiger.bark() 
 

 //相同点和不同点 
 


 //8.在值类型(结构体)中修改属性 
 
 struct student1{ 
 

     //定义属性 
 
     var number =100 
 
     var grade =3 
 
    //在值类型中定义实例方法 并在实例方法中修改结构体的属性的话 需要使用关键字mutating 
 
     mutatingfunc study(){ 
 
     
 
     self.number= 60 
 
        print(":\(self.number)") 
 
     
 
     } 
 
    //在实例方法中可以直接对self进行修改 
 
     mutatingfunc play(){ 
 
        //使用逐一构造器 
 
        self = student1(number: 30, grade: 8) 
 
        print("学生人数:\(self.number),年级:\(self.grade)") 
 
     
 
     } 
 

 } 
 

 var stu1 = student1() 
 
 stu1.play() 
 
 stu1.study() 
 

 //9.类的继承 
 
 class Car{ 
 

     var carName= "" 
 
     var price =0.0 
 
     
 
    //可以在父类的实例化方法中添加final关键字 表示 设置此方法不被子类重写 
 
 //    final funcrun(){ 
 
      func run(){ 
 
     
 
        print("奔跑吧,皮卡丘") 
 
     
 
     } 
 
     
 
 } 
 

 //通过类的继承 子类可以继承父类所有的方法和属性 
 
 //和oc一样 swift中不许多继承 
 
 class AutoCar:Car{ 
 
    //给子类添加一个新的属性 
 
     var factory= "山东蓝翔" 
 

 } 
 

 var autoCar = AutoCar() 
 
 autoCar.carName = "兰博基尼" 
 
 autoCar.price = 1.0; 
 
 autoCar.run() 
 

 class Bicycle:Car{ 
 
    //如果要在子类中重写父类的方法 需要用override关键字进行表明 
 
     overridefunc run() { 
 
        print("奔跑吧,呵呵") 
 
     } 
 
     
 
 } 
 

 var bicycle = Bicycle() 
 
 bicycle.run() 
 


 //五 构造函数 (init函数或者初始化函数) 
 

 class Bird { 
 

     var name ="" 
 
     var age =0 
 
     letwight:Double 
 
    //创建构造方法 
 
    //构造方法的作用为当类被实例化时 第一个调用的方法 
 
    init(){ 
 
    print("bird") 
 
     
 
    //swift中的构造方法可以给常量赋值 
 
        self.wight = 2.0 
 
     
 
     } 
 
    //带有内部参数的构造方法 
 
    init(name:String){ 
 
     self.name =name 
 
     self.wight =3.0 
 
   
 
     } 
 

    //带有外部参数的构造方法 
 
     init(namepara1:String,age para2:Int){ 
 
        self.name = para1 
 
        self.age = para2 
 
        self.wight = 4.0 
 

     } 
 
    //隐藏外部参数的构造方法 
 
    init(para1:String,_para2:Int){ 
 
        self.name = para1 
 
        self.age = _para2 
 
        self.wight = 4.0 
 

     } 
 

 } 
 


 //创建bird对象 
 
 var bird1 = Bird.init() 
 
 var bird2 = Bird.init(name:"喜鹊") 
 
 var bird3 = Bird.init(name:"",age:3) 
 
 //var bird4 = Bird.init("麻雀",3) 
 


 class FlyBird:Bird{ 
 

    //在子类中重写父类的构造方法 
 
     
 
     overrideinit(){ 
 
     
 
    super.init() 
 
     
 
     
 
     } 
 
     
 
     //析构函数 
 
     //只适用于类当一个类的实例被释放后 析构器会被立即调用 析构器使用关键字deinit来标明 
 
    deinit{ 
 
     
 
    print("析构器被调用") 
 
     
 
     
 
     } 
 
 } 
 

 //实例化 
 
 var flyBird:FlyBird? = FlyBird() 
 
 print(flyBird) 
 

 //将flyBird对象置为nil 才会被调用 
 
 flyBird = nil 
 

 //六 扩展 
 
 //使用extension关键字定义扩展 
 

 extension Int { 
 
     //扩展属性 
 
     var a: Int{ 
 
        //扩展之后进行的操作 
 
        return self * self 
 
     } 
 

 } 
 
 //通过点直接调用属性 
 
 print(5.a) 
 

 extension Bird { 
 

     //扩展属性 
 
     varbirdColor:String { 
 
         
 
        return self.name + "是白色的" //self指的还是bird对象 
 
         
 
     } 
 
     //扩展方法 
 
     funcsingSong(){ 
 
     
 
    print("\(self.name)在唱歌") 
 
     
 
     } 
 

 } 
 

 //通过扩展向父类中提添加的属性和方法 都可以传递给子类 
 
 var bird11 = FlyBird() 
 

 bird11.name = "鹦鹉" 
 
 print(bird11.birdColor) 
 
 print(bird11.singSong())