Swift Protocols(協議)、Extensions(擴展)、Error Handling(錯誤處理)、Generics(泛型)

最近在學習 Swift,總結相關知識


1. Protocols(協議)

1.1 協議的定義和實現

  • 協議(protocol 是一種定義方法和屬性的藍圖,任何類、結構體或枚舉都可以遵循協議。
  • 遵循協議后,需要實現協議中定義的所有內容。
示例
protocol ExampleProtocol {var simpleDescription: String { get }mutating func adjust()
}
  • simpleDescription 定義了一個只讀屬性。
  • mutating 標記方法可以修改遵循協議的值類型(如結構體、枚舉)。
實現協議
  • 類(class 遵循協議:

    class SimpleClass: ExampleProtocol {var simpleDescription: String = "A very simple class."var anotherProperty: Int = 69105func adjust() {simpleDescription += " Now 100% adjusted."}
    }
    
    • 方法 adjust 可以直接修改屬性,無需標記為 mutating
  • 結構體(struct 遵循協議:

    struct SimpleStructure: ExampleProtocol {var simpleDescription: String = "A simple structure"mutating func adjust() {simpleDescription += " (adjusted)"}
    }
    
    • mutating 必須添加,因為結構體是值類型,默認情況下,方法不能修改實例。

1.2 擴展協議要求

向協議 ExampleProtocol 添加新的要求:

protocol ExampleProtocol {var simpleDescription: String { get }mutating func adjust()func detailedDescription() -> String
}class SimpleClass: ExampleProtocol {var simpleDescription: String = "A very simple class."func adjust() {simpleDescription += " Now 100% adjusted."}func detailedDescription() -> String {return "This is \(simpleDescription)"}
}struct SimpleStructure: ExampleProtocol {var simpleDescription: String = "A simple structure"mutating func adjust() {simpleDescription += " (adjusted)"}func detailedDescription() -> String {return "This is \(simpleDescription)"}
}

2. Extensions(擴展)

2.1 擴展定義

擴展可以用來為現有的類、結構體、枚舉或協議添加功能,例如添加方法、計算屬性或協議一致性。

示例:擴展 Int
extension Int: ExampleProtocol {var simpleDescription: String {return "The number \(self)"}mutating func adjust() {self += 42}
}
print(7.simpleDescription) // 輸出:The number 7
實驗:擴展 Double 添加 absoluteValue
extension Double {var absoluteValue: Double {return self >= 0 ? self : -self}
}
print((-3.14).absoluteValue) // 輸出:3.14

3. Error Handling(錯誤處理)

3.1 錯誤類型

  • Swift 的錯誤類型必須遵循 Error 協議,通常用 enum 定義。
enum PrinterError: Error {case outOfPapercase noTonercase onFire
}

3.2 拋出和捕獲錯誤

  • 使用 throw 拋出錯誤,使用 throws 標記函數可能拋出錯誤。
  • 使用 do-catch 捕獲錯誤。
示例
func send(job: Int, toPrinter printerName: String) throws -> String {if printerName == "Never Has Toner" {throw PrinterError.noToner}return "Job sent"
}do {let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")print(printerResponse)
} catch PrinterError.noToner {print("No toner available.")
} catch {print(error)
}

3.3 使用 try?defer

  • try? 拋出錯誤時返回 nil
  • defer 無論函數是否拋出錯誤,都執行清理代碼。
示例
let printerSuccess = try? send(job: 1884, toPrinter: "Mergenthaler")
let printerFailure = try? send(job: 1885, toPrinter: "Never Has Toner")func fridgeContains(_ food: String) -> Bool {defer { print("Fridge closed.") } // 確保清理return ["milk", "eggs"].contains(food)
}

4. Generics(泛型)

4.1 泛型函數

  • 泛型允許編寫通用代碼,支持多種類型。
func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {var result: [Item] = []for _ in 0..<numberOfTimes {result.append(item)}return result
}
makeArray(repeating: "knock", numberOfTimes: 4)

4.2 泛型類型

  • 例如,重新實現 Swift 標準庫的 Optional 類型:
enum OptionalValue<Wrapped> {case nonecase some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)

4.3 泛型約束

  • 使用 where 指定類型約束。
func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Boolwhere T.Element: Equatable, T.Element == U.Element {for lhsItem in lhs {for rhsItem in rhs {if lhsItem == rhsItem {return true}}}return false
}
anyCommonElements([1, 2, 3], [3])
實驗:返回公共元素數組
func commonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> [T.Element]where T.Element: Equatable, T.Element == U.Element {var result: [T.Element] = []for lhsItem in lhs {if rhs.contains(lhsItem) {result.append(lhsItem)}}return result
}
print(commonElements([1, 2, 3], [3, 4, 5])) // 輸出:[3]

總結

Swift 提供了許多現代化特性:

  1. Protocols 和 Extensions: 提供靈活的功能擴展和一致性約束。
  2. Error Handling: 提供 throwdo-catchtry? 等靈活的錯誤處理機制。
  3. Generics: 支持編寫通用、高效、類型安全的代碼。
  4. 類型安全性: Swift 的類型系統可以有效防止運行時錯誤,提升代碼可靠性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65189.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uni-app開發-習慣養成小程序/app介紹

目錄 一:功能概述 二:功能部分代碼和截圖 一:功能概述 1 習慣目標生成 創建習慣:用戶可以添加新的習慣目標,每個習慣可以包含名稱、描述、圖標、目標天數。 關聯習慣完成:用戶通過設定達成目標以后,生成習慣養成記錄。 2 習慣打卡 簡單快捷的打卡:提供一個直觀的界面…

【HTML】Day02

【HTML】Day02 1. 列表標簽1.1 無序列表1.2 有序列表1.3 定義列表 2. 表格標簽2.1 合并單元格 3. 表單標簽3.1 input標簽基本使用3.2 上傳多個文件 4. 下拉菜單、文本域5. label標簽6. 按鈕button7. div與span、字符實體字符實體 1. 列表標簽 作用&#xff1a;布局內容排列整齊…

基于Spring Boot的車輛違章信息管理系統(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

Git - 記錄一次由于少輸入了一個命令導致的更改丟失

Git - 記錄一次由于少輸入了一個參數導致的更改丟失 前言 某晚我激情開發了幾個小時&#xff0c;中途沒有進行commit存檔。準備睡覺時&#xff0c;我想創建一個新的分支并將今晚所有更改提交到新分支上&#xff08;似乎應該開發時候就創建&#xff1f;&#xff09;。 然后因…

探索Rust在Web開發中的實際應用

近年來&#xff0c;Rust語言因其高性能、內存安全性和強大的工具鏈支持而迅速崛起。在Web開發領域&#xff0c;Rust提供了一套高效、現代化的框架和工具&#xff0c;使得開發者能夠構建快速、安全的Web應用程序。在本文中&#xff0c;我們將深入探討如何使用Rust進行Web開發&am…

Apache Celeborn 在B站的生產實踐

背景介紹 Shuffle 演進 隨著B站業務的飛速發展,數據規模呈指數級增長,計算集群也逐步從單機房擴展到多機房部署模式。多個業務線依托大數據平臺驅動核心業務,大數據系統的高效性與穩定性成為公司業務發展的重要基石。如圖1,目前在大數據基礎架構下,我們主要采用 Spark、Fl…

第29天:Web開發-PHP應用弱類型脆弱Hash加密Bool類型Array數組函數轉換比較

#知識點 1、安全開發-原生PHP-弱類型脆弱 2、安全開發-原生PHP-函數&數據類型 3、安全開發-原生PHP-代碼審計案例 一、PHP弱類型對比 1、 和 兩個等號是弱比較&#xff0c;使用進行對比的時候&#xff0c;php解析器就會做隱式類型轉換&#xff0c;如果兩個值的類型不相等就…

Kafaka安裝與啟動教程

1.下載 先去官網Apache Kafka可以查看到每個版本的發布時間。選擇你要安裝的版本。 然后進入linux建立要存放的文件夾&#xff0c;用wget命令下載 2.安裝 先解壓縮&#xff1a; tar -xvzf kafka_2.12-3.5.1.tgz -C ../ 3.配置文件 修改server.properties&#xff1a; cd .…

回歸預測 | MATLAB實ELM-Adaboost多輸入單輸出回歸預測

回歸預測 | MATLAB實ELM-Adaboost多輸入單輸出回歸預測 目錄 回歸預測 | MATLAB實ELM-Adaboost多輸入單輸出回歸預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 一、極限學習機&#xff08;ELM&#xff09; 極限學習機是一種單層前饋神經網絡&#xff0c;具有訓練速…

1、pycharm、python下載與安裝

1、去官網下載pycharm 官網&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows 2、在等待期間&#xff0c;去下載python 進入官網地址&#xff1a;https://www.python.org/downloads/windows/ 3、安裝pycharm 桌面會出現快捷方式 4、安裝python…

GESP2023年12月認證C++五級( 第三部分編程題(1)小楊的幸運數)

參考程序&#xff1a; #include <iostream> #include <cmath> using namespace std;int nextPerfectSquare(int a) {int sqrt_a (int)sqrt(a);if (sqrt_a * sqrt_a < a) {sqrt_a; // 如果 sqrt(a) 的平方小于 a&#xff0c;那么就需要加 1&#xff0c;找到下…

25年1月更新。Windows 上搭建 Python 開發環境:Python + PyCharm 安裝全攻略(文中有安裝包不用官網下載)

引言 隨著 Python 在數據科學、Web 開發、自動化腳本等多個領域的廣泛應用&#xff0c;越來越多的開發者選擇它作為首選編程語言。而 PyCharm 作為一個功能強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;為 Python 開發者提供了極大的便利。本文將詳細介紹如何在 …

IDEA配置maven和git并如何使用maven打包和git推送到gitlab

首先找到設置 在里面輸入maven然后找到點擊 然后點擊右邊兩個選項 路徑選擇下載的maven目錄下的settings文件和新建的repository文件夾 點擊apply應用 然后在搜索框里搜git點擊進去 此路徑為git的exe執行文件所在目錄&#xff0c;選好之后點擊test測試下方出現git版本號表…

【Rust 知識點雜記】

1、self和Self 在Rust中&#xff0c;self 和 Self 有不同的含義和用法&#xff0c;它們通常出現在結構體、枚舉或實現&#xff08;impl&#xff09;塊的上下文中。 self: self 是一個關鍵字&#xff0c;它代表方法調用時實例本身的引用。當在一個方法定義中使用 self 作為第一…

【Vue學習】Vue 組件實例的生命周期(四個階段,八個鉤子)

一、為什么要理解生命周期&#xff1f; 理解生命周期就像是知道了一部電影的劇情走向&#xff0c;能讓你在適當的時機做出反應。Vue 生命周期的鉤子讓你可以在不同的階段插入你的邏輯&#xff0c;像是提前準備、后期清理或者在數據更新時做點事情。這種“精確控制”的能力會讓你…

【Vue】<script setup>和 <script>區別是什么?在使用時的寫法區別?

<script setup> 是 Vue 3 引入的一種新的腳本語法&#xff0c;它提供了一種更簡潔和聲明式的方式來編寫組件邏輯。它是為了解決傳統 <script> 標簽在 Vue 單文件組件&#xff08;SFC&#xff09;中的一些局限性而設計的。 <script setup> 與 <script>…

Kotlin 數據類與密封類

Kotlin 數據類與密封類 引言 在 Kotlin 中&#xff0c;數據類和密封類是兩種非常重要的類類型&#xff0c;它們各自具有獨特的用途和優勢。數據類主要用于存儲數據&#xff0c;而密封類則用于表示受限的類層次結構。在本篇文章中&#xff0c;我們將深入探討 Kotlin 中的數據類…

Linux之信號量

目錄 信號量 信號量相關接口 創建信號量 初始化信號量 等待信號量&#xff0c;P操作 發布信號量&#xff0c;V操作 銷毀信號量 基于信號量的環形隊列下的生產者和消費者模型 環形隊列 代碼實現 上期我們學習了線程同步的概念&#xff0c;掌握了基于阻塞隊列的生產…

【電子通識】PWM驅動讓有刷直流電機恒流工作

電機的典型驅動方法包括電壓驅動、電流驅動以及PWM驅動。本文將介紹采用PWM驅動方式的恒流工作。 首先介紹的是什么是PWM驅動的電機恒流工作&#xff0c;其次是PWM驅動電機恒流工作時電路的工作原理。 PWM驅動 當以恒定的電流驅動電機時&#xff0c;電機會怎樣工作呢&#xff1…

非docker方式部署openwebui過程記錄

之前一直用docker方式部署openwebui&#xff0c;結果這東西三天兩頭升級&#xff0c;我這一升級拉取docker鏡像硬盤空間嗖嗖的占用&#xff0c;受不了&#xff0c;今天改成了直接部署&#xff0c;以下是部署過程記錄。 一、停止及刪除沒用的docker鏡像占用的硬盤空間 docker s…