Swift中初始化方法的顺序介绍

yizhihongxing

Swift中初始化方法的顺序介绍

Swift中对象初始化过程分为两部分:第一部分是为对象的存储空间分配内存,并进行对该内存空间的初始化;第二部分是为对象的属性分配内存,并对该属性进行初始化。下面我们将详细介绍Swift中初始化方法的顺序。

1. 分配内存空间

1.1 Swift运行时为类分配内存空间,该内存空间包含实例变量和类方法列表。

1.2 Swift编译器根据类中定义的属性的存储特性分别计算存储属性内存布局,并把存储的位置信息填充到类的类型信息中。同时,Swift编译器也会为每个存储属性生成getter和setter方法的实现,以便在对象初始化和属性访问时被使用。

1.3 当通过调用类的初始化方法来创建对象时,Swift运行时分配对象的内存空间,并在该内存空间中保存实例变量的值和指向类的指针。该指针是用来支持通过子类调用继承自父类的方法的。

2. 初始化对象属性

2.1 Swift编译器会在类的初始化方法中插入一些代码,用于为属性分配默认值。

2.2 得益于 Swift 语言强大的类型推断系统,不必显式地对变量赋初值,Swift 会根据在变量声明的类型来赋初值,同时,在初始化的过程中类似 !nil 的分配空间的代码也会被插入,保证初始化过程的完整性。

2.3 在这个过程中也可能会通过公共的初始化方法来初始化属性。

2.4 便利初始化方法其实就是对默认初始化方法的封装,它只是初始化对象的某些属性而不是全部,也就是只是对本类自身属性的初始化,不会调用父类的初始化方法,也无法通过便利初始化方法来访问父类的属性。称之为便利初始化方法的原因是其主要目的是横跨层级调用其余初始化方法,虽然该方法可以使用和重写验证的便利初始化方法。

示例如下:

class Person {
    var name: String
    var age: Int
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    convenience init(name: String) {
        self.init(name: name, age: 0)
    }
}

class Employee: Person {
    var job: String
    init(name: String, age: Int, job: String) {
        self.job = job
        super.init(name: name, age: age)
    }
    convenience override init(name: String, age: Int) {
        self.init(name: name, age: age, job: "")
    }
}

在上面的示例中,定义了一个Person类和一个Employee类,Employee类是Person类的子类,它可以继承Person类的属性和方法。

Person类有两个属性:name和age,以及一个指定初始化方法init(name:age:)。同时,还有一个便利初始化方法init(name:),该方法用于实现只传入name参数时的初始化。

Employee类有一个额外的属性:job,以及一个指定初始化方法init(name:age:job:)。它也继承了Person类的init(name:age:)方法。Employee类也有一个便利初始化方法init(name:age:),该方法可以用来初始化Employee对象时只传入name和age两个参数的情况。

在这个示例中,指定初始化方法和便利初始化方法的调用顺序是固定的。当调用便利初始化方法时,总会先调用它所对应的指定初始化方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Swift中初始化方法的顺序介绍 - Python技术站

(0)
上一篇 2023年6月20日
下一篇 2023年6月20日

相关文章

  • 新版maven3.6.1下载与安装

    下面是关于“新版maven3.6.1下载与安装”的完整攻略: 1. 下载maven3.6.1 首先,我们需要从官方网站下载maven3.6.1的安装包。可以在以下链接中找到maven3.6.1的下载链接:https://maven.apache.org/download.cgi 选择合适版本下载,这里以apache-maven-3.6.1-bin.tar.g…

    other 2023年5月7日
    00
  • Vue3中动态修改样式与级联样式优先顺序图文详解

    Vue3中动态修改样式与级联样式优先顺序图文详解 1. 简介 在Vue3中,动态修改样式可以通过绑定数据到元素的class或style属性实现。而级联样式优先顺序是指当一个元素同时匹配多个CSS选择器的样式规则时,浏览器会根据优先级来决定应用哪个样式规则。在本攻略中,我们将详细讲解如何在Vue3中实现动态样式的修改,并解释级联样式优先顺序的规则。 2. Vu…

    other 2023年6月28日
    00
  • Android基于reclyview实现列表回弹动画效果

    Android基于RecyclerView实现列表回弹动画效果攻略 在Android开发中,我们经常需要使用RecyclerView来展示列表数据。为了提升用户体验,我们可以为RecyclerView添加回弹动画效果,使得列表在滑动到边界时能够产生弹性效果。下面是实现这一效果的完整攻略。 步骤一:导入依赖库 首先,在项目的build.gradle文件中添加以…

    other 2023年9月6日
    00
  • Win10修改管理员名称的方法

    下面是详细的Win10修改管理员名称的攻略。 步骤一:打开计算机管理 首先,按下Win+X组合键,选择”计算机管理” 步骤二:进入用户管理 在计算机管理左侧选择”本地用户和组”,再选择”用户”,在右侧选择管理员账户 步骤三:修改管理员名称 右键点击管理员账户,选择”重命名”,输入新的管理员名称,例如”myadmin” 示例一:使用命令行修改管理员名称 如果你…

    other 2023年6月27日
    00
  • 如何恢复隐藏的文件夹

    恢复隐藏的文件夹需要以下步骤: 步骤一:显示隐藏文件夹设置 打开文件资源管理器 在顶部菜单栏中选择“查看”选项卡 打开“选项”-“更改文件夹和搜索选项” 在“视图”选项卡下找到“隐藏文件、文件夹和驱动器”并选中“显示隐藏的文件、文件夹和驱动器” 点击“确定”按钮保存设置 步骤二:寻找隐藏文件夹 打开文件资源管理器 在左侧菜单栏中选择“此电脑” 在顶部搜索框中…

    其他 2023年4月16日
    00
  • webpack常用配置项配置文件介绍

    下面是对”webpack常用配置项配置文件介绍”的详细讲解: 简介 Webpack是一个现代JavaScript应用程序的模块打包器,在实现代码的模块化管理方面表现卓越,而在实现代码生产上也拥有强大的优化能力。在使用Webpack时,最常用的就是对webpack配置文件进行配置,在此过程中,需要了解一些Webpack的常用配置项。 常用的配置项 以下是Web…

    other 2023年6月25日
    00
  • 扩展IP地址

    扩展IP地址攻略 1. 理解IP地址扩展的概念 IP地址扩展是指将一个网络的IP地址范围扩大,以容纳更多的设备或主机。这通常是在网络规模扩大或需要更多IP地址时进行的操作。IP地址扩展可以通过两种方式实现:子网划分和使用更大的IP地址段。 2. 子网划分 子网划分是一种将一个网络划分为多个子网的方法,以增加可用的IP地址数量。这种方法可以通过将网络的子网掩码…

    other 2023年7月30日
    00
  • 原生Js页面滚动延迟加载图片实现原理及过程

    原生Js页面滚动延迟加载图片实现原理及过程,可以通过下面的攻略来详细讲解: 一、原理 页面滚动时,对视窗中的图片进行懒加载。当图片进入可视区域时,再加载该图片。这样可以减轻页面一次性加载所有图片的负担,提高网站的响应速度和性能。 具体实现原理如下: 检测网页中的所有图片 获取页面可视范围内的图片 预先将可视范围内的图片的 src 属性设为 loading 动…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部