final
被final修飾的方法、下標(biāo)、屬性,禁止被重寫/被final修飾的類,禁止被繼承
mutating
值類型(結(jié)構(gòu)體、枚舉)的方法要修改成員的話,需要加上mutating。協(xié)議方法聲明為mutating,實(shí)現(xiàn)也要mutating
required
用required修飾指定初始化器,表明其所有子類都必須實(shí)現(xiàn)該初始化器(通過繼承或者重寫實(shí)現(xiàn))
如果子類重寫了required初始化器,也必須加上required,不用加override
typealias
別名 typealias RealPerson = Person & Livable & Runnable ,func fn(obj: RealPerson) {}
Any
可以代表任意類型(枚舉、結(jié)構(gòu)體、類,也包括函數(shù)類型)
AnyObject
可以代表任意類類型(在協(xié)議后面寫上: AnyObject代表只有類能遵守這個(gè)協(xié)議)
AnyClass
public typealias AnyClass = AnyObject.Type
is
用來判斷是否為某種類型,以及是否是相同的類、其子類、是否遵守判斷的協(xié)議
as?、as!、as
as用來做強(qiáng)制類型轉(zhuǎn)換 (stu as? Student)?.study()
Self
Self一般用作返回值類型,限定返回值跟方法調(diào)用者必須是同一類型(也可以作為參數(shù)類型)。類似OC中的instancetype
throws
1 函數(shù)內(nèi)部通過throws拋出自定義Error,可能會(huì)拋出Error的函數(shù)必須加上throws聲明
2 不捕捉Error,在當(dāng)前函數(shù)增加throws聲明,Error將自動(dòng)拋給上層函數(shù)
rethrows
rethrows表明:函數(shù)本身不會(huì)拋出錯(cuò)誤,但調(diào)用閉包參數(shù)拋出錯(cuò)誤,那么它會(huì)將錯(cuò)誤向上拋
defer
用來定義以任何方式(拋錯(cuò)誤、return等)離開代碼塊前必須要執(zhí)行的代碼
defer語句將延遲至當(dāng)前作用域結(jié)束之前執(zhí)行
defer{}一般拿來做確保完成的,收尾的工作。
associatedtype
關(guān)聯(lián)類型的作用:給協(xié)議中用到的類型定義一個(gè)占位名稱。協(xié)議中可以擁有多個(gè)關(guān)聯(lián)類型
associatedtype Element // 關(guān)聯(lián)類型
some
使用some關(guān)鍵字聲明一個(gè)不透明類型。用于隱藏返回類型,或一次那個(gè)屬性類型
some限制只能返回一種類型
some除了用在返回值類型上,一般還可以用在屬性類型上
some也用于枚舉中關(guān)聯(lián)值
var age3:Optional<Int> = Optional.some(30)
inout
修改了函數(shù)的參數(shù),需要添加輸入輸出參數(shù),變?yōu)橐脗鬟f。inout關(guān)鍵字
open、public、internal、fileprivate、private
以模塊、文件為單位控制訪問權(quán)限。絕大部分實(shí)體默認(rèn)都是 internal 級(jí)別
1 open:允許在定義實(shí)體的模塊、其他模塊中訪問,允許其他模塊進(jìn)行繼承、重寫(open只能用在類、類成員上)
2 public:允許在定義實(shí)體的模塊、其他模塊中訪問,不允許其他模塊進(jìn)行繼承、重寫
3 internal(內(nèi)部):只允許在定義實(shí)體的模塊中訪問,不允許在其他模塊中訪問
4 fileprivate:只允許在定義實(shí)體的源文件中訪問
5 private:只允許在定義實(shí)體的封閉聲明中訪問
weak、unowned
weak定義弱引用.通過unowned定義無主引用
import Dispatch
導(dǎo)入GCD模塊,
UnsafePointer、UnsafeMutablePointer、UnsafeRawPointer、UnsafeMutableRawPointer
UnsafePointer<Pointee> 類似于 const Pointee *
UnsafeMutablePointer<Pointee> 類似于 Pointee *
UnsafeRawPointer 類似于 const void *
UnsafeMutableRawPointer 類似于 void *
指針pointee訪問無泛型,有泛型指針獲取load是加載,store是存儲(chǔ)。
ptr.pointee += 20
ptr.storeBytes(of: 20, as: Int.self)
ptr.load(as: Int.self)
@frozen、@inlinable
@frozen 和 @inlinable 是保證這個(gè)enum, struct, function的結(jié)構(gòu)不變
@frozen 是對(duì) enum, struct 使用
@inlinable 是對(duì) function 使用
可以保證在項(xiàng)目中引用的某 framework 替換后仍然不需要重新編譯,
因?yàn)?enum, struct, function 的鏈接沒有發(fā)生改變
@_silgen_name
如果知道系統(tǒng)級(jí)別的函數(shù),但是該函數(shù)沒有頭文件暴露,可以用這個(gè)方法調(diào)用。
比如用下面的方法:
第一步我們在上面WS_Person.h中去掉int sum(int a, int b);函數(shù)聲明
第二步,然后在Swift文件中全局區(qū)
@silgen_name("sum")
func sum( v1: Int32, _ v2: Int32) -> Int32
第三步,直接調(diào)用sum(33, 44)
@objcMembers
必須是被@objcMembers或@objc修飾的方法才可以定義選擇器。我們給button,手勢,添加方法。也要用到@objc.
OC調(diào)用swift,@objcMembers修飾swift類。代表默認(rèn)所有成員都會(huì)暴露給OC(包括擴(kuò)展中定義的成員)
@objc
1 OC調(diào)用swift,使用@objc修飾swift文件的屬性或方法,選擇性暴露給OC。
2 OC調(diào)用swift,可以通過 @objc 重命名Swift暴露給OC的符號(hào)名(類名、屬性名、函數(shù)名等)
3 被 @objc 修飾的協(xié)議,還可以暴露給OC去遵守實(shí)現(xiàn)
4 可以通過 @objc 定義可選協(xié)議(這種協(xié)議只能被 class 遵守)
5 必須是被@objcMembers或@objc修飾的方法才可以定義選擇器。
我們給button,手勢,添加方法。也要用到@objc.原理同1,沒有暴漏給OC的方法名是不能使用的。
perform(@Selector)和 @selector()本來就是Runtime,OC的。
dynamic
被 @objc dynamic 修飾的內(nèi)容會(huì)具有動(dòng)態(tài)性,比如調(diào)用方法會(huì)走runtime那一套流程
Swift 支持 KVC \ KVO 的條件:屬性所在的類、監(jiān)聽器最終繼承自 NSObject,并且@objc dynamic 修飾對(duì)應(yīng)的屬性。
@discardableResult
@discardableResult 表示返回值可以忽略,如果沒有用到返回值也不會(huì)有警告
Sequence
Sequence 是一個(gè)協(xié)議,它表示一個(gè)可以遍歷其元素的集合類型。任何遵循 Sequence 協(xié)議的類型都必須提供一個(gè)迭代器,用于按順序訪問其元素。Swift 標(biāo)準(zhǔn)庫中的許多集合類型,如數(shù)組(Array)、集合(Set)、字典的值(Dictionary.Values)以及字符串(String),都遵循 Sequence 協(xié)議。此外,你也可以創(chuàng)建自定義類型并使其遵循 Sequence 協(xié)議,以提供自定義的遍歷行為。
Sendable 和 @Sendable
Swift 5.5 的版本,Apple 引入了多項(xiàng)對(duì)于并發(fā)性改進(jìn),其中 Sendable 和 @Sendable 是兩個(gè)核心概念,它們解決了結(jié)構(gòu)化的并發(fā)結(jié)構(gòu)體和 actor 消息之間傳遞的類型檢查問題。類不是線程安全的,不能傳遞,所以編譯器不能隱式地將其標(biāo)記為 Sendable。因?yàn)?final class 是不可改變的(immutable),因此它是線程安全的,所以我們可以顯示的讓其遵守 Sendable 協(xié)議。
Sendable 協(xié)議是 Swift 并發(fā)模型中的一個(gè)關(guān)鍵協(xié)議,它向編譯器表明某個(gè)類型是否可以被安全的跨并發(fā)域(如 actors、并發(fā)隊(duì)列等)傳遞。當(dāng)類型符合 Sendable 協(xié)議時(shí),編譯器可以保證該類型的實(shí)例在并發(fā)環(huán)境下是線程安全的。
Sendable
@inlinable
編譯器內(nèi)聯(lián)函數(shù)優(yōu)化
inlinable中文
inlinable英文
try-catch
do {
try expression
} catch {
print(error)
}