Swift学习笔记

Swift - 类、初始化器

2022-03-16  本文已影响0人  aven_kang

class和struct的区别

1.结构体是值类型,不能继承
2.类是引用类型,可以继承
3.类可以重写方法以及属性,结构体不行,因为不存在继承
4.类有多态,结构体没有
5.生成一个类,跟生成一个结构体,从汇编语言来看,类需要生成很多的汇编语言,而结构体则很少,从效率上来讲,简单的可以用结构体,效率更高

结构体、类、枚举都有初始化器

枚举一般不定义初始化器
class Point {
    var x:Int
    init() {
       x = 10
    }
}

var p = Point(x:10)

便捷初始化器 - convenience

class Size {
        
        var width:Int
        var height:Int
        
        init(width:Int,height:Int){
            self.width = width;
            self.height = height;
            // do something more
        }
        
        convenience init(width:Int) {
            self.init(width: width, height: 0)
        }
    }
在上述代码中,我们可以看到有两个初始化器,其中第一个,是我们主要的初始化器,里面可能初始化了很多的属性或其他的东西,在第二个初始化器中,主要是为了给开发者更多的入口,不必强制使用我们的指定初始化器,但是为了确保安全,因为可能有很多的属性需要初始化,而在第二个初始化器中,并未提供height的入口,所以我们需要在第二个初始化器中,调用第一个指定初始化器,确保属性都是初始化了,这种就是便捷初始化器,其初衷是为了安全,第二方面是为了提供更多的入口。
截屏2022-02-20 下午3.31.38.png

指定初始化器必须从它的父类调用指定初始化器

class Size {
        
        var width:Int
        var height:Int
        
        init(width:Int,height:Int){
            self.width = width;
            self.height = height;
        }
        
        convenience init(width:Int) {
            self.init(width: width, height: 0)
        }
    }
    
    class subSize:Size {
        
        var score:Int
        init(score:Int){
            self.score = score
            super.init(width: 0, height: 0)
            
        }
    }

在上述代码中,subSize继承Size,在写指定初始化器的时候,如果光写

init(score:Int){
            self.score = score
        }

这个指定初始化器,会报错,因为继承自Size,需要初始化父类的指定初始化器,还有一个要点,score的初始化,需要放在父类的初始化前面

class subSize:Size {
        
        var score:Int
        init(score:Int){
            self.score = score
            super.init(width: 0, height: 0)
            
        }
    }

先确保本类的属性得到初始化,再保证父类的初始化完毕

初始化器的相互调用

截屏2022-02-20 下午5.30.47.png
class Size {
        
        var width:Int
        var height:Int
        
        init(width:Int,height:Int){
            self.width = width;
            self.height = height;
        }
        
        convenience init(width:Int) {
            self.init(width: width, height: 0)
        }
    }
    
    class subSize:Size {
        
        var score:Int = 0
//        init(score:Int){
//            self.score = score
//            super.init(width: 0, height: 0)
//        }
    }

如果子类没有初始化器,那么在创建subSize这个对象的时候,是需要调用父类的初始化器初始化成员属性,否则会报错

var subSizes = subSize(width: 0, height: 0)
上一篇下一篇

猜你喜欢

热点阅读