• swift学习笔记->类


    swift中类的定义方式

    class 类名{

      属性。。。

      方法。。。

    }

    类是一个引用类型,其实例是分配到堆中  来看看类里面的属性方法有何不同之处

    类中的属性分为存储属性,计算属性

    存储属性可以有属性观察器 但计算属性没有   (计算属性在类被继承之后可以添加观察者)

    计算属性拥有get set 方法 

    class Person {
        //属性,方法,构造函数,析构函数,,索引器(subscript)
        //stored properties   computed properties
        var p1 = 20
        //属性观察器 property observer
        var name = "swift" {
            willSet{  //在赋值前会调用willSet里面的内容
                //            print("before")
                print(newValue) //新值
                //            print(name)
                
            }
            didSet(old){
                print("after")
                print(old)
                print(name);
            }
        }
        var p2 = 30
        //计算属性 ,get set
        //不能只有set,只有get的时候,表示只读计算属性,可以简写
        //计算属性是没有属性观察者
        var age:Int {
            get{
                return 100
            }
            set{
                
            }
        }
        
        var readOnlyAge:Int {
            get{
                return 100
            }
            //当只有get属性时推断为只读属性,get可以省去  如下
        }
        
        var readOnlyAge2:Int {
            
            //code.
            //code。
            return 100
            
            
        }
        
        //    func m() {
        //
        //    }
       //构造函数,可以有多个
       init(){
           print("init")
       }
        //
        //    deinit {
        //        print("deinit")
        //    }
        //
    }

    代码上已经能看到两种属性的写法,方法函数与函数篇写的一样  没有什么区别

    值得注意的是  在类的实例化(初始化)时,所有属性都必须有值  否则会出错

    恒等于 :三个等号是判断两个变量是否指向同一个对象

    class test{
      let a:Int=4  
    }
    var aa=test()
    var bb=test()
    aa==bb//报错
    aa===bb//false
    aa=bb
    aa===bb//true

    修饰

    1修饰为静态,可以用class和static

    2存储属性,只能用static,计算属性两个关键字都可以

    3方法也是两个关键字都可以

    4区别:class修饰的表示子类是可以重写这些静态成员

    class Image{
        static var name = "my"
        //class var name2 = "aaa"//存储属性不能用class修饰
        static var Age:Int {
            get{
            return 100
            }set{
                
            }
        }
        static func someMethod() {
            
            // 静态方法中得self不是指的类的实例,而是指类本身
            //self
            //self.Age  =
        }
        class func someMethod2(){
            
        }
    }

    下标subscript

    class XiangCe {
        var images = [1,2,3,4]
        
        //下标  subscript,可以有多个参数
        subscript(index: Int) ->Int {
            get{
                return images[index]
            }
            set{
                images[index] =  newValue
            }
        }
        
        func getImage(index: Int)->Int {
            return images[index]
        }
    }
    
    let xc = XiangCe()
    xc.getImage(0)
    xc[0]
    xc[0] =  100
    xc[0]

    lazy 延迟加载

    当属性加上lazy修饰时  在实例化对象时该属性不会初始化,直到调用该属性时才会进行初始化

    下面这个例子能看出lazy的作用

    class A{
        init(){
            print("a init")
        }
    }
    
    class B {
        lazy var p = A()
    }
    
    let b = B()
    //b.p

    实例化B类时没有输出 a init 而访问B类中的P属性时输出了   说明它在访问的时候才进行初始化工作

  • 相关阅读:
    centos下安装Anaconda
    centos下安装python2.7.9和pip以及数据科学常用的包
    mysql基础(5)-关联(mysql+pandas)
    mysql基础(4)-数据导入
    mysql基础(3)-高级查询
    mysql基础(2)-数据处理(mysql+pandas)
    mysql基础(1)-基本操作
    创建线程的三种方法
    Jar 包 及运行Jar包
    导出成可运行jar包时所遇问题的解决办法
  • 原文地址:https://www.cnblogs.com/pengser/p/4970031.html
Copyright © 2020-2023  润新知