美文网首页Swift学习笔记
Swift - 类、初始化器

Swift - 类、初始化器

作者: aven_kang | 来源:发表于2022-03-16 11:39 被阅读0次

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)

相关文章

  • Swift语法 -- [12 - 初始化器]

    Swift 初始化 1. 初始化器 类、结构体、枚举都可以定义初始化器 类有2种初始化器: 指定初始化器(desi...

  • Swift构造器

    推荐swiftGG的官方文档翻译《swift构造器》 swift类的构造分为两个阶段,第一个阶段是指定构造器初始化...

  • 认识Swift系列13之对象初始化

    Swift中初始化器: 指定初始化器(designated initializer) 便捷初始化器(conveni...

  • Swift - 类、初始化器

    class和struct的区别 1.结构体是值类型,不能继承 2.类是引用类型,可以继承 3.类可以重写方法以及属...

  • swift5基本语法-init?可失败初始化器

    在Swift中,类、结构体、枚举都可以使用init?来定义可失败初始化器。如下所示: 系统中的可失败初始化器应用场...

  • swift初始化 init

    swift初始化器有两种: 指定初始化器(designated initializer) 便捷初始化器(conve...

  • swift初始化器

    初始化器 类、结构体、枚举都可以定义初始化器 类初始化器 类有2种初始化器:指定初始化器(designated i...

  • Swift 5.x 类的继承和初始化

    所有类的存储属性(包括从它的父类继承的所有属性)都必须在初始化期间分配初始值 Swift为类类型定义了两种初始化器...

  • swift5基本语法-初始化器

    在swift中,类class、结构体struct、枚举enum 都可以定义初始化器。实际开发中枚举自定义初始化用的...

  • 十二、初始化

    初始化 类、结构体、枚举都可以定义初始化器 (本章主要讲类的初始化) 类有2种初始化器 指定初始化器 便捷初始化器...

网友评论

    本文标题:Swift - 类、初始化器

    本文链接:https://www.haomeiwen.com/subject/ekamlrtx.html