網站首頁 編程語言 正文
初始化器
required
用required修飾指定初始化器,表明其所有子類都必須實現該初始化器(通過繼承或者重寫實現)
如果子類重寫了required初始化器,也必須加上required,不用加上override
class Person {
required init() {}
init(age: Int) {}
}
class Student: Person {
init(no: Int) {
super.init(age: 0)
}
required init() {
super.init()
}
}
屬性觀察器
父類的屬性在它自己的初始化器中賦值不會觸發屬性觀察器,但在子類的初始化器中賦值會觸發屬性觀察器
class Person {
var age: Int {
willSet {
print("willSet", newValue)
}
didSet {
print("didSet", oldValue, age)
}
}
init() {
self.age = 0
}
}
class Student: Person {
override init() {
super.init()
self.age = 1
}
}
可失敗初始化器
類、結構體、枚舉都可以使用init?定義可失敗初始化器
class Person {
var name: String
init?(name: String) {
if name.isEmpty {
return nil
}
self.name = name
}
}
不允許同時定義參數標簽、參數個數、參數類型相同的可失敗初始化器和非可失敗初始化器
可以用init!定義隱式解包的可失敗初始化器
可失敗初始化器可以調用非可失敗初始化器,非可失敗初始化器調用可失敗初始化器需要進行解包
class Person {
var name: String
init?(name: String) {
if name.isEmpty {
return nil
}
self.name = name
}
convenience init() {
self.init(name: "")!
}
}
如果初始化器調用一個可失敗初始化器導致初始化失敗,那么整個初始化過程都失敗,并且之后的代碼都停止執行
可以用一個非可失敗初始化器重寫一個可失敗初始化器,但反過來是不行的。
反初始化器(deinit)
deinit叫做反初始化器,類似于C++的析構函數、OC中的dealloc方法
當類的實例對象被釋放內存時,就會調用實例對象的deinit方法
class Person {
deinit {
print("Person對象銷毀了")
}
}
deinit不接受任何參數,不能寫小括號,不能自行調用
父類的deinit能被子類繼承
子類的deinit實現執行完畢后會調用父類的deinit
可選鏈(Optional Chaining)
class Car {
var price = 0
}
class Dog {
var weight = 0
}
class Person {
var name: String = ""
var dog: Dog = Dog()
var car: Car? = Car()
func age() -> Int {
18
}
func eat() {
print("Person eat")
}
subscript(index: Int) -> Int {
return index
}
}
var person: Person? = Person()
var age = person?.age()//Int? Optional(18)
var age1 = person!.age() // Int
var name = person?.name //String?
var index = person?[6] // Int?
如果可選項為nil,調用方法、下標、屬性失敗,結果為nil
如果可選項不為nil,調用方法、下標、屬性成功,結果會被包裝成可選項
如果結果本來就是可選項,不會進行再次包裝
判斷方法有沒有調用成功:
if let age = person?.age() { // ()?
print("調用age成功", age)
} else {
print("調用age失敗")
}
形成可選鏈:
多個?可以鏈接在一起
如果鏈中任何一個節點是nil,那么整個鏈就會調用失敗,可選鏈應用的地方還是很多的,在OC里面我們通常會加很多判斷以避免崩潰,在Swift里面,因為有了可選鏈會減少很多我們自己的判斷,提高了安全性。
var dog = person?.dog // Dog?
var weight = person?.dog.weight // Int?
var price = person?.car?.price // Int?
var scores = [
"Jack" : [86, 82, 84],
"Rose" : [79, 94, 81]
]
scores["Jack"]?[0] = 100
scores["Rose"]?[2] += 10
scores["Kate"]?[0] = 88
var num1: Int? = 5
num1? = 10 // Optional(10)
var num2: Int? = nil
num2? = 10 // nil
var dict: [String : (Int, Int) -> Int] = [
"sum" : (+), //兩個Int類型相加,返回一個Int類型
"difference" : (-)
]
var result = dict["sum"]?(10, 20) // Optional(30), Int?
原文鏈接:https://blog.csdn.net/run_in_road/article/details/125960726
相關推薦
- 2022-04-23 論C++的lambda是函數還是對象_C 語言
- 2022-05-13 html頁面 加載完成后再刷新 一次
- 2022-04-05 Python?Opencv基于透視變換的圖像矯正_python
- 2022-08-14 協同開發巧用gitignore中間件避免網絡請求攜帶登錄信息_Golang
- 2022-05-01 基于Python的Houdini插件開發過程詳情_python
- 2022-11-12 基于Python制作一個匯率換算程序_python
- 2022-10-21 IDEA集成Docker實現一鍵部署的詳細過程_docker
- 2023-09-18 document.getElementById()獲取一直為null
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支