網(wǎng)站首頁 編程語言 正文
初始化
初始化器
1、類、結(jié)構(gòu)體、枚舉都可以定義初始化器
class Size {
init(age: Int) {
}
}
var s = Size(age: 10)
2、類有2種初始化器:指定初始化器(deaignated initializer)、便捷初始化器(convenience initializer)
class Size {
//指定初始化器
init(age: Int) {
}
//便捷初始化器
convenience init(age: Int) {
}
}
3、每個類至少有一個指定初始化器,指定初始化器是類的主要初始化器
4、默認(rèn)初始化器總是類的指定初始化器
5、類偏向于少量指定初始化器,一個類通常只有一個指定初始化器
6、初始化器的相互調(diào)用規(guī)則,會更安全
指定初始化器必須從它的直系父類調(diào)用指定初始化器;
class Person {
var age: Int
init(age: Int) {
self.age = age
}
convenience init() {
self.init(age: 0)
}
}
class Student: Person {
var score: Int
init(age: Int, score: Int) {
self.score = score
super.init(age: age)
}
}
便捷初始化器必須從相同的類里調(diào)用另一個初始化器;
便捷初始化器最終必須調(diào)用一個指定初始化器;
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)
}
convenience init(height: Int) {
self.init(width: 0, height: height)
}
convenience init() {
self.init(width: 0, height: 0)
}
}
var s1 = Size(width: 10, height: 20)
var s2 = Size(width: 10)
var s3 = Size(height: 20)
var s4 = Size()
初始化器的相互調(diào)用
兩段式初始化
1、Swift在編碼安全方面是煞費苦心,為了保證初始化過程的安全,設(shè)定了兩段式初始化、安全檢查。
2、兩段式初始化,第1階段:初始化所有存儲屬性
- 外層調(diào)用指定\便捷初始化器
- 分配內(nèi)存給實例,但未初始化
- 指定初始化器確保當(dāng)前類定義的存儲屬性都初始化
- 指定初始化器調(diào)用父類的初始化器,不斷向上調(diào)用,形成初始化器鏈
3、兩段式初始化,第2階段:設(shè)置新的存儲屬性值
從頂部初始化器往下,鏈中的每一個指定初始化器都有機(jī)會進(jìn)一步定制實例
初始化器現(xiàn)在能夠使用self(訪問、修改它的屬性,調(diào)用它的實例方法等等)
最終,鏈中任何便捷初始化器都有機(jī)會定制實例以及使用self
class Person {
var age: Int
init(age: Int) {
self.age = age
self.test()
}
func test() {
}
}
class Student: Person {
var score: Int
init(age: Int, score: Int) {
self.score = score
super.init(age: age)
}
convenience init() {
self.init(age: 0, score: 0)
}
}
安全檢查
1、指定初始化器必須保證在調(diào)用父類初始化器之前,其所在類定義的所有存儲屬性都要初始化完成
2、指定初始化器必須先調(diào)用父類初始化器,然后才能為繼承的屬性設(shè)置新值
3、便捷初始化器必須先調(diào)用同類中的其他初始化器,然后再為任意屬性設(shè)置新值
4、初始化器在第1階段初始化完成之前,不能調(diào)用任何實例方法,不能讀取任何實例屬性的值,也不能引用self
重寫
1、當(dāng)重寫父類的指定初始化器時,必須加上override(即使子類的實現(xiàn)是便捷初始化器)
2、如果子類寫了一個匹配父類便捷初始化器的初始化器,不用加上override
因為父類的便捷初始化器永遠(yuǎn)不會通過子類直接調(diào)用,因此,嚴(yán)格來說,子類無法無法重寫
父類的便捷初始化器。
class Person {
var age: Int
init(age: Int) {
self.age = age
}
convenience init() {
self.init(age: 0)
}
}
class Student: Person {
var score: Int
init(age: Int, score: Int) {
self.score = score
super.init(age: age)
}
init() {
self.score = 0
super.init(age: 0)
}
}
自動繼承
1、如果子類沒有自定義任何指定初始化器,他會自動繼承父類所有的指定初始化器
2、如果子類提供了父類所有指定初始化器的實現(xiàn)(要么通過方式1繼承,要么重寫)
子類會自動繼承所有的父類便捷初始化器
3、就算子類添加了更多的便捷初始化器,這些規(guī)則仍然適用
class Person {
var age: Int
var name: String
init(age: Int, name: String) {
self.age = age
self.name = name
}
init() {
self.age = 0
self.name = ""
}
convenience init(age: Int) {
self.init(age: age, name: "")
}
convenience init(name: String) {
self.init(age: 0, name: name)
}
}
class Student: Person {
var no: Int = 0
convenience init(no: Int) {
self.init()
}
}
原文鏈接:https://blog.csdn.net/run_in_road/article/details/125654292
相關(guān)推薦
- 2023-04-18 Python中selenium獲取token的方法_python
- 2024-03-18 JedisDataException: READONLY You can‘t write again
- 2021-12-08 Vmware虛擬機(jī)設(shè)置固定IP地址的方法(?圖文教程)_VMware
- 2022-09-18 C#?中的partial?關(guān)鍵字詳解_C#教程
- 2022-06-16 Beego中ORM操作各類數(shù)據(jù)庫連接方式詳細(xì)示例_Golang
- 2023-01-03 flutter中的布局和響應(yīng)式app方法示例_Android
- 2023-01-15 Python?pytest.main()運行測試用例_python
- 2022-09-13 Android實現(xiàn)屏幕旋轉(zhuǎn)四個方向準(zhǔn)確監(jiān)聽_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支