zoukankan      html  css  js  c++  java
  • Swift语言学习---------高级

    一.结构体.

    示例代码:

    //*****************结构体(Struct)***************
    //1.声明一个结构体
    struct rect{
      //声明结构体变量成员的属性(存储属性)
        var x:Float
        var y:Float
        var With:Float
        var Height:Float
        
        //声明结构体属性
        //注意:需要使用Static关键字修饰
        static var description:String?
        
        //计算属性(本身不存值,专门用于计算其他属性的值)
        var centerX :Float{
          //setter方法
            set{
        
            x = newValue
            
        }
          //getter方法
            get{
            
            return x + With/2
            
            }
        }
        
        var centerY :Float{
        
            get{
            
                return y;
            }
    
        }
        //声明方法
        //声明一个结构体对象(结构体变量)方法[类似于类中的实例(对象)方法]
        func info(){
         print("x:(x) y:(y) (With) height:(Height)")
        
        }
        //声明结构体方法[类似于类中的类的方法]
        static func info1(){
              print("这是一个结构体方法")
        
        }
        
    }
    //1.根据结构体类型创建结构体对象(结构体变量)
    var rect1 = rect(x: 0, y: 0, With: 100, Height: 100)
    //注意:如果结构体对象是常量内部的属性是不允许修改的
    
    //访问结构体对象的属性
    rect1.x = 20
    
    print(rect1.x)
    
    //访问结构体属相
    rect.description = "我是结构体属性"
    
    print(rect.description!)
    //访问结构体对象的计算属性
    rect1.centerX = 100 //在调用center中的setter方法
    let value = rect1.centerX   //在使用centerx的getter方法
    
    //使用结构体对象方法
    rect1.info()
    
    
    //使用结构体方法
    rect.info1()

    二.类及继承

    示例代码:

    //类*****************************************
    //class Person{
    //    var name:String?
    //    var age:Int?
    //    //构造方法
    //    init(name:String, age:Int){
    //        self.name = name
    //        self.age = age
    //    }
    //}
    //
    ////创建一个Person对象
    //var p1:Person = Person(name: "张三 ", age: 20)
    //
    ////访问类中的属性
    //print(p1.name!)
    //print(p1.age!)
    
    class Person {
        //声明属性
        var name:String?
        var age:Int?
        
        //声明类属性
        static var introduce:String!   //(存储属性)
        //声明计算属性(类,结构体,枚举)
        var number:Int{
            get{
            
              return self.age!
            }
            set(value){   //这种写法表示在调用number的set方法时传过来的参数赋值给value
              age = value   //注意切记setter/getter方法中不能使用self.的形式
            
            }
        
        
        }
        
        //声明类方法  static修饰时,不能被子类重写   class修饰的可以
        static func sayHi(){
        
            print(introduce)
            //注意在类方法中不能使用对系那个属性,只能使用类属性
            
        }
        
        class func sayHi2(){
    
        }
        //声明构造方法
        init(name:String,age:Int){
           self.name = name
            self.age = age
        
        }
        init(name:String){
           self.name = name
        
        }
        //声明一个对象方法
        func sayHello(){
           print("我是对象方法")
        
        }
      
    }
    
    
    //继承
    class Student:Person {
        //重写父类的类方法
        override class func sayHi2(){
        
            print("我是Student类,重写了父类的类方法")
        
        
        }
    }
    
    //
    let person = Person (name: "李四", age: 25)
    person.sayHello()   //使用对象方法
    Person.sayHi2()   //使用的是类方法
    Student.sayHi2()  //使用的Student中重写父类的那个方法
    
    //创建Student对象
    let  student:Student = Student(name: "小碗", age: 21)
    
    
    //值类型与引用类型***************************************
    //值类型变量
    //struct animal {
    //
    //    var name:String?
    //    var age:Int?
    //    
    //
    //}
    //var dog = animal(name: "小明", age: 2)
    //var dog1 = dog   //此时dog1是从dog拷贝过来的值,是一份新值
    //dog.name = "小花"
    //print("(dog.name!),(dog1.name!)")
    
    //引用类型变量
    
    class  animal {
    
        var name:String?
        var age:Int?
        init(name:String , age:Int){
            self.name = name
            self.age = age
        
        }
    
    }
    var dog = animal(name: "小黄", age: 3)
    var dog1 = dog   //此时dog1是从dog拷贝过来的值,是一份新值
    dog.name = "小花"
    print("(dog.name!),(dog1.name!)")

    三.协议及扩展.

    示例代码:

    //协议(protocol)***************************************
    //当协议前有可选方法时,该协议前要用关键字@objec修饰,可选实现方法用optional修饰
    @objc protocol  MerrayDelegate{
    
       func cook()  //做饭
       func wach()  //洗衣服
       optional func hitDoudou() //打豆豆
    
    }
    protocol DividDelegate{
    
       func lookAfterChild()
    
    }
    
    class Man: Person,MerrayDelegate,DividDelegate {
        
        @objc func cook() {
            print("还好学了几年手艺")
        }
        
        @objc func wach() {
            print("手洗")
        }
      
        func lookAfterChild() {
            print("看小孩")
        }
    }
    //扩展   (实现代码的分离,不过与臃肿)
    extension Man{
        @objc func hitDoudou() {
            print("打豆豆")
        }
    
    }
    
    
    //
    let man:Man = Man(name: "黄海波", age: 40)
    
    man.cook()
    
    man.hitDoudou()
    
    //扩展(extension)**************************************************
    
    //1.扩展一个类遵循的协议的方法的实现
    //扩展   (实现代码的分离,不过与臃肿)
    
    //extension Man{
    //    @objc func hitDoudou() {
    //        print("打豆豆")
    //    }
    //    
    //}
    
    //2.扩展一个类的方法(类似于oc中的category类目)
    extension Man {
        //扩展一个对象方法
        func sing(){
          print("哈哈")
        }
       //扩展一个类方法
        class func eat() {
            print("吃饭")
        }
    }
    man.sing()
    Man.eat()

    四.闭包

    闭包类似于于block函数  ]

    注意:闭包的函数体部分由关键字 in 引入。 该关键字表示闭包的参数和返回值类型定义已经完成,
    闭包函数体即将开始。

    示例代码:

    //闭包  相当于block函数
    //求两个整型数中的最大值
    //第一种方式实现闭包
    var maxResult:((a:Int, b:Int) ->Int) = {
    //这个函数的类型是(a:Int, b:Int) ->Int
    
        (a:Int,b:Int)->Int in
        
        return a > b ? a : b
    
    }
    
    print(maxResult(a: 3, b: 5))
    
    //第二种方式
    maxResult = {
      a,b in
     return a > b ? a : b
    
    }
    
    //第三种方式
    maxResult = {
        a,b in
        a > b ? a : b
        
    }
    
    //第四种
    maxResult = {
        $0 > $1 ? $0:$1
    
    }
    
    //第五种
    maxResult = {
       (a,b) -> Int in
        a > b ? a : b
    }
    
    print(maxResult(a: 3, b: 5))
     
     
  • 相关阅读:
    CF161D Distance in Tree
    [WC2010]重建计划 长链剖分
    [FJOI2014]最短路径树问题 长链剖分
    [Vani有约会]雨天的尾巴 线段树合并
    Friend Links
    Nerdtree+高亮+图标配置
    【CF1416C】XOR Inverse
    01-Trie 学习
    【[USACO19DEC】Milk Visits G
    【ARC069D】Flags
  • 原文地址:https://www.cnblogs.com/erdeng/p/4933753.html
Copyright © 2011-2022 走看看