Swift常用知識小結(jié)(一)

Swift的結(jié)構(gòu)體和class有什么區(qū)別?

在 Swift 中,結(jié)構(gòu)體(Struct)和類(Class)是兩種用于定義自定義數(shù)據(jù)類型的重要構(gòu)造。它們有一些區(qū)別和不同的特性:

  1. 值類型 vs 引用類型:結(jié)構(gòu)體是值類型,而類是引用類型。值類型在被賦值給變量或傳遞給函數(shù)時,會被復(fù)制一份,而引用類型則會共享同一個實例。這意味著當對結(jié)構(gòu)體進行賦值或傳遞時,會創(chuàng)建一個獨立的副本,而對類進行賦值或傳遞時,只是復(fù)制了引用,指向同一個實例。

  2. 內(nèi)存管理:Swift 使用自動引用計數(shù)(ARC)來管理內(nèi)存。對于類的實例,當沒有引用指向它時,內(nèi)存會被自動釋放。而對于結(jié)構(gòu)體,它們通常是在棧上分配的,當超出作用域時會自動釋放。

  3. 繼承:類支持繼承,可以從一個基類派生出子類,并且可以重寫父類的屬性和方法。而結(jié)構(gòu)體不支持繼承。

  4. 默認成員逐一構(gòu)造器:結(jié)構(gòu)體在沒有自定義構(gòu)造器的情況下會自動生成默認的成員逐一構(gòu)造器,而類則沒有默認的成員逐一構(gòu)造器,需要自己定義。

  5. 可變性:類的實例可以修改其屬性,即使它們是常量(let)類型。而結(jié)構(gòu)體是值類型,對于常量類型的結(jié)構(gòu)體實例,其屬性是不可修改的。

結(jié)構(gòu)體和類在使用場景上也有一些不同:

  • 當你需要一個輕量級的數(shù)據(jù)結(jié)構(gòu)來封裝少量相關(guān)的值時,可以使用結(jié)構(gòu)體。例如,坐標點、顏色、大小等。
  • 當你需要引用語義、繼承性和高級功能(如類型轉(zhuǎn)換和析構(gòu)函數(shù))時,可以使用類。例如,定義對象的模型、創(chuàng)建單例對象等。

需要根據(jù)具體的需求和情況來選擇使用結(jié)構(gòu)體或類。結(jié)構(gòu)體通常適合于簡單的值類型數(shù)據(jù)和輕量級的對象,而類適用于更復(fù)雜的對象、對象之間的關(guān)系和需要共享狀態(tài)的情況。

Swift中的多線程和線程鎖

在 Swift 中,多線程編程可以使用 Grand Central Dispatch (GCD) 和 Operation Queue 來實現(xiàn)。這些框架提供了一種簡單且高效的方式來管理并發(fā)任務(wù)和線程。

GCD 是一個基于隊列的并發(fā)編程框架,它使用任務(wù)和隊列來管理多線程執(zhí)行。以下是 GCD 的一些常用概念:

  1. 隊列 (Dispatch Queue):隊列是用來管理任務(wù)的執(zhí)行順序的。GCD 提供了兩種類型的隊列:串行隊列 (Serial Queue) 和并發(fā)隊列 (Concurrent Queue)。串行隊列按照添加任務(wù)的順序逐個執(zhí)行,而并發(fā)隊列可以并行執(zhí)行多個任務(wù)。

  2. 任務(wù) (Dispatch Work Item):任務(wù)是執(zhí)行工作的代碼塊。在 GCD 中,可以創(chuàng)建一個任務(wù),并將其提交到隊列中進行執(zhí)行。任務(wù)可以是同步執(zhí)行或異步執(zhí)行,取決于是否阻塞當前線程。

  3. 主隊列 (Main Queue):主隊列是一個特殊的串行隊列,用于在主線程上執(zhí)行任務(wù)。它通常用于更新 UI 或執(zhí)行與 UI 相關(guān)的工作,因為所有 UI 操作都必須在主線程上執(zhí)行。

使用 GCD,你可以創(chuàng)建自定義隊列、異步或同步地提交任務(wù),并使用合適的隊列類型和調(diào)度方式來管理多線程任務(wù)。

在多線程編程中,線程鎖是一種用于同步訪問共享資源的機制。在 Swift 中,可以使用 NSLock、NSRecursiveLockNSCondition 等線程鎖類來確保線程安全。

下面是一個使用 GCD 和線程鎖的示例,展示了如何在 Swift 中執(zhí)行多線程任務(wù)和使用線程鎖:

import Foundation

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
let lock = NSLock()

concurrentQueue.async {
    lock.lock()
    defer {
        lock.unlock()
    }
    // 執(zhí)行需要保護的代碼塊
    // ...
}

concurrentQueue.async {
    lock.lock()
    defer {
        lock.unlock()
    }
    // 執(zhí)行需要保護的代碼塊
    // ...
}

在上面的示例中,我們創(chuàng)建了一個并發(fā)隊列 concurrentQueue 和一個線程鎖 lock。然后,我們使用 async 方法將兩個任務(wù)提交到隊列中執(zhí)行。在每個任務(wù)中,我們使用 lock 來鎖定關(guān)鍵代碼段,并在執(zhí)行完成后解鎖,以確保線程安全性。

需要注意的是,在使用線程鎖時要小心避免出現(xiàn)死鎖的情況。死鎖可能在不正確地使用鎖或在同一個隊列中同步地等待相互依賴的任務(wù)時發(fā)生。確保正確地使用鎖,并避免潛在的死鎖情況是保證多線程程序正確性的重要方面。

為什么說Swift比oc效率高,你為啥選擇它開發(fā)?

Swift 和 Objective-C 是在不同的時間和背景下開發(fā)的兩種編程語言。以下是一些關(guān)于 Swift 相對于 Objective-C 的效率優(yōu)勢和選擇原因的主要理由:

  1. 性能優(yōu)化:Swift 在性能方面進行了優(yōu)化,它是一門經(jīng)過精心設(shè)計的編程語言,具有更快的執(zhí)行速度和更低的內(nèi)存消耗。Swift 使用了現(xiàn)代的編程語言特性和編譯器優(yōu)化,使得其性能較 Objective-C 更高效。

  2. 安全性:Swift 在語言層面上增加了許多安全特性,如類型推斷、空值檢查、強制類型轉(zhuǎn)換等。這些特性可以幫助開發(fā)人員在編寫代碼時捕獲更多的錯誤,并減少潛在的崩潰和安全漏洞。

  3. 可讀性和可維護性:Swift 語法更加簡潔和易讀,它引入了許多現(xiàn)代編程語言的特性,如可選類型、閉包、泛型等,使得代碼更易于理解和維護。Swift 的代碼通常比 Objective-C 更緊湊,減少了冗余和樣板代碼的數(shù)量。

  4. 互操作性:Swift 與 Objective-C 兼容,可以與現(xiàn)有的 Objective-C 代碼進行混編。這意味著可以逐步采用 Swift 來開發(fā)新的功能,同時保留和重用現(xiàn)有的 Objective-C 代碼庫。

  5. Apple 的主推語言:Swift 是 Apple 官方推出的首選語言,它獲得了 Apple 的大力支持和持續(xù)的更新和改進。隨著時間的推移,Swift 在蘋果生態(tài)系統(tǒng)中的地位和支持將繼續(xù)增強。

作為一個開發(fā)者,選擇使用 Swift 進行開發(fā)的原因可能因人而異。一些常見的原因包括:性能提升、代碼的可讀性和可維護性增加、更好的安全性、更好的語言特性和現(xiàn)代化、更好的互操作性以及與蘋果的官方推薦保持一致。

需要注意的是,語言選擇應(yīng)該基于項目需求和開發(fā)者的技術(shù)偏好。Objective-C 仍然是一個強大而成熟的語言,對于某些項目和特定的開發(fā)場景仍然是一個合適的選擇。

Swift高階函數(shù)的特性和使用場景?

Swift 中的高階函數(shù)是指可以接受其他函數(shù)作為參數(shù)或返回函數(shù)作為結(jié)果的函數(shù)。這種函數(shù)式編程的特性提供了強大的工具,可以簡化代碼、提高可讀性和可維護性。以下是高階函數(shù)的一些特性和常見的使用場景:

  1. 函數(shù)作為參數(shù):高階函數(shù)可以接受其他函數(shù)作為參數(shù),這使得我們可以將行為作為參數(shù)傳遞給函數(shù),從而實現(xiàn)更靈活的功能。常見的函數(shù)作為參數(shù)的高階函數(shù)有 map、filter、reduce 等。

  2. 函數(shù)作為返回值:高階函數(shù)可以返回另一個函數(shù)作為結(jié)果,使得我們可以根據(jù)不同的條件或上下文返回不同的函數(shù)。例如,工廠函數(shù)可以根據(jù)不同的參數(shù)返回不同的實例化函數(shù)。

  3. 匿名函數(shù)或閉包:在使用高階函數(shù)時,常常使用匿名函數(shù)或閉包作為參數(shù)傳遞,以便更方便地定義和傳遞功能。

  4. 函數(shù)組合:高階函數(shù)可以通過組合多個函數(shù)來創(chuàng)建新的函數(shù)。函數(shù)組合可以將多個簡單的函數(shù)組合成一個更復(fù)雜的功能。

常見的高階函數(shù)包括:

  • map:用于對集合中的每個元素應(yīng)用一個函數(shù),并返回由函數(shù)返回值組成的新集合。
  • filter:根據(jù)指定的條件對集合進行過濾,返回符合條件的元素組成的新集合。
  • reduce:通過對集合中的元素進行累積操作,返回一個單一的結(jié)果值。
  • flatMap:將嵌套的集合展平為一個單層集合,并對每個元素應(yīng)用一個函數(shù)。
  • sort:對集合中的元素進行排序。

使用高階函數(shù)的場景包括:

  • 轉(zhuǎn)換和映射:使用 map 函數(shù)可以對集合中的每個元素進行轉(zhuǎn)換或映射,生成一個新的集合。
  • 過濾和篩選:使用 filter 函數(shù)可以根據(jù)條件過濾集合中的元素,生成一個新的子集。
  • 聚合和歸約:使用 reduce 函數(shù)可以對集合中的元素進行聚合操作,生成一個單一的結(jié)果值。
  • 嵌套集合的處理:使用 flatMap 函數(shù)可以處理嵌套的集合,并將其展平為一個單層集合。
  • 排序:使用 sort 函數(shù)可以對集合中的元素進行排序。

高階函數(shù)提供了一種更抽象、更靈活的編程方式,可以提高代碼的可讀性和可維護性。它們允許我們將通用的操作抽象出來,減少代碼的重復(fù)性,并以一種聲明式的方式來表達我們的意圖。

Swift鏈式調(diào)用的原理?

在 Swift 中,鏈式調(diào)用是一種編程模式,它允許我們通過在連續(xù)的方法調(diào)用之間返回對象本身來實現(xiàn)方法的鏈式調(diào)用。這種模式也被稱為流暢接口(Fluent Interface)或方法鏈(Method Chaining)。

鏈式調(diào)用的原理基于以下兩個關(guān)鍵點:

  1. 返回 self 或返回對同一對象的引用:每個方法調(diào)用都應(yīng)該返回對象本身或?qū)ν粚ο蟮囊?。這樣,我們就可以在一個方法調(diào)用之后繼續(xù)調(diào)用其他方法,形成鏈式調(diào)用。

  2. 使用無返回值方法:鏈式調(diào)用中的方法通常是無返回值的。因為如果一個方法有返回值,那么該方法的返回類型將不再是對象本身,就無法進行連續(xù)調(diào)用。

為了實現(xiàn)鏈式調(diào)用,我們需要在每個方法中返回對象本身或?qū)ν粚ο蟮囊谩_@樣做的方式可以有多種,但常見的方式是在方法中返回 self,也就是當前對象的引用。

下面是一個示例,展示了如何使用鏈式調(diào)用在 Swift 中創(chuàng)建一個自定義的對象:

class Person {
    var name: String = ""
    var age: Int = 0

    func setName(_ name: String) -> Person {
        self.name = name
        return self
    }

    func setAge(_ age: Int) -> Person {
        self.age = age
        return self
    }
}

let person = Person()
    .setName("John")
    .setAge(25)

在上面的示例中,Person 類中的 setNamesetAge 方法都返回了 Person 對象本身,使得我們可以在創(chuàng)建 person 對象的同時連續(xù)調(diào)用這兩個方法,實現(xiàn)了鏈式調(diào)用的效果。

需要注意的是,鏈式調(diào)用可以提高代碼的可讀性和簡潔性,但過度使用鏈式調(diào)用可能會使代碼難以理解和維護。在設(shè)計和使用鏈式調(diào)用時,要權(quán)衡代碼的可讀性和可維護性,確保它符合項目的需求和規(guī)范。

Swift網(wǎng)絡(luò)請求框架?

Swift 中有多個流行的網(wǎng)絡(luò)請求框架可供選擇。以下是其中一些常用的框架:

  1. Alamofire:Alamofire 是一個基于 Swift 的優(yōu)雅、簡潔的網(wǎng)絡(luò)請求框架。它提供了豐富的功能,如鏈式請求、文件上傳、下載、認證等。Alamofire 是一個功能強大且廣泛使用的框架,具有良好的社區(qū)支持。

  2. URLSession:URLSession 是 Apple 官方提供的用于網(wǎng)絡(luò)請求的框架,可用于發(fā)送 HTTP 請求、處理響應(yīng)和管理任務(wù)。它是 Swift 中默認的網(wǎng)絡(luò)請求框架,提供了異步和同步請求、身份驗證、Cookie 管理等功能。

  3. Moya:Moya 是一個基于 Alamofire 的網(wǎng)絡(luò)抽象層框架。它通過使用枚舉定義網(wǎng)絡(luò)請求,提供了類型安全和可測試性。Moya 可以簡化網(wǎng)絡(luò)請求的編寫,并提供了插件機制和易于測試的功能。

  4. URLSessionWebSocketTask:URLSessionWebSocketTask 是用于處理 WebSocket 連接的 Apple 官方框架。它提供了 WebSocket 的支持,用于在客戶端和服務(wù)器之間進行實時的雙向通信。

這些框架都有各自的特點和優(yōu)勢,選擇哪個框架取決于你的具體需求和偏好。你可以根據(jù)項目的要求選擇適合的網(wǎng)絡(luò)請求框架。

Alamofire的底層原理是怎樣的?

Alamofire 是一個基于 Swift 的網(wǎng)絡(luò)請求框架,它提供了簡潔、靈活且功能強大的 API,用于進行 HTTP 網(wǎng)絡(luò)請求。Alamofire 的底層原理主要基于以下幾個核心組件:

  1. URLSession:Alamofire 使用了 Swift 標準庫中的 URLSession 類來進行底層的網(wǎng)絡(luò)請求操作。URLSession 提供了發(fā)送 HTTP 請求、處理響應(yīng)和管理任務(wù)的功能。

  2. URLRequest 和 URLResponse:Alamofire 使用 URLRequest 來表示要發(fā)送的 HTTP 請求,其中包含請求的 URL、HTTP 方法、請求頭等信息。URLResponse 則表示服務(wù)器返回的 HTTP 響應(yīng),包含響應(yīng)狀態(tài)碼、響應(yīng)頭和響應(yīng)體等信息。

  3. 網(wǎng)絡(luò)隊列和任務(wù)管理:Alamofire 使用自定義的 OperationQueue 來管理并發(fā)的網(wǎng)絡(luò)請求任務(wù)。它使用了 Operation 和 OperationQueue 的機制來實現(xiàn)任務(wù)的調(diào)度和控制。每個網(wǎng)絡(luò)請求被封裝為一個自定義的 Operation 對象,可以添加到 OperationQueue 中進行執(zhí)行。

  4. 請求和響應(yīng)的處理:Alamofire 通過創(chuàng)建自定義的 Request 對象來表示一個網(wǎng)絡(luò)請求。Request 對象封裝了 URLRequest 和回調(diào)閉包等信息。當請求被發(fā)送時,Alamofire 會根據(jù)配置創(chuàng)建一個 URLSessionDataTask,并將其添加到網(wǎng)絡(luò)隊列中執(zhí)行。一旦收到響應(yīng),Alamofire 將解析響應(yīng)數(shù)據(jù),包裝成一個自定義的 Response 對象,并將其傳遞給請求的回調(diào)閉包進行處理。

  5. 附加功能和攔截器:Alamofire 提供了許多附加功能,如請求認證、請求攔截器和響應(yīng)攔截器等。這些功能可以用于在請求發(fā)送前或響應(yīng)返回后執(zhí)行額外的操作,如添加認證頭、日志記錄等。

總的來說,Alamofire 的底層原理是建立在 URLSession 的基礎(chǔ)上,通過自定義的網(wǎng)絡(luò)隊列和任務(wù)管理機制來處理并發(fā)的網(wǎng)絡(luò)請求。它提供了簡潔的 API,使得發(fā)送和處理網(wǎng)絡(luò)請求變得更加方便和靈活。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容