Swift---協議和擴充套件、 錯誤處理、泛型
使用協議宣告協議。
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
類、列舉和結構都可以採用協議。
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {
simpleDescription += " Now 100% adjusted."
}
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
注意在SimpleStructure宣告中使用mutation關鍵字來標記修改結構的方法。SimpleClass的宣告不需要任何標記為mutation的方法,因為類上的方法總是可以修改類。
使用擴充套件向現有型別新增功能,例如新方法和計算屬性。您可以使用擴充套件將協議一致性新增到其他地方宣告的型別,甚至新增到從庫或框架匯入的型別。
extension Int: ExampleProtocol {
var simpleDescription: String {
return "The number \(self)"
}
mutating func adjust() {
self += 42
}
}
print(7.simpleDescription)
// Prints "The number 7"
您可以像使用任何其他命名型別一樣使用協議名稱—例如,建立具有不同型別但都符合單個協議的物件集合。當您處理型別為協議型別的值時,協議定義之外的方法不可用。
let protocolValue: ExampleProtocol = a
print(protocolValue.simpleDescription)
// Prints "A very simple class. Now 100% adjusted."
// print(protocolValue.anotherProperty) // Uncomment to see the error
使用採用錯誤協議的任何型別表示錯誤。
enum PrinterError: Error {
case outOfPaper
case noToner
case onFire
}
有幾種方法可以處理錯誤。一種方法是使用do-catch。在do塊中,您可以通過在前面寫入try來標記可能丟擲錯誤的程式碼。在catch塊中,除非您給它一個不同的名稱,否則錯誤將自動被指定為名稱錯誤。
do {
let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")
print(printerResponse)
} catch {
print(error)
}
// Prints "Job sent"
另一種處理錯誤的方法是使用try?將結果轉換為可選的。如果函式丟擲一個錯誤,特定的錯誤將被丟棄,結果為nil。否則,結果是一個可選的,包含函式返回的值。
let printerSuccess = try? send(job: 1884, toPrinter: "Mergenthaler")
let printerFailure = try? send(job: 1885, toPrinter: "Never Has Toner")
泛型
在尖括號內寫一個名稱來建立泛型函式或型別。
func makeArray(repeating item: Item, numberOfTimes: Int) -> [Item] {
var result = [Item]()
for _ in 0..
result.append(item)
}
return result
}
print( makeArray(repeating: "knock", numberOfTimes: 4))
//["knock", "knock", "knock", "knock"]
您可以建立函式和方法的通用 泛型形式,以及類、列舉和結構的。
enum OptionalValue {
case none
case some(Wrapped)
}
var possibleInteger: OptionalValue = .none
print(possibleInteger)
// none
possibleInteger = .some(100)
print(possibleInteger)
// some(100)
在正文前面指定需求列表——例如,要求型別實現協議,要求兩種型別相同,或者要求類具有特定的超類。
func anyCommonElements(_ lhs: T, _ rhs: U) -> Bool
where T.Element: Equatable, T.Element == U.Element
{
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
return true
}
}
}
return false
}
print(anyCommonElements([1, 2, 3], [3]))
// true
相關文章
- iOS 協議的繼承和擴充套件iOS協議繼承套件
- OAuth 2.0 擴充套件協議之 PKCEOAuth套件協議
- 開源 | SOFAMesh 的通用協議擴充套件協議套件
- MacOs 安裝擴充套件錯誤列表Mac套件
- Swift 核心動畫 面向協議 擴充套件封裝Swift動畫協議套件封裝
- swift學習筆記4——擴充套件、協議Swift筆記套件協議
- amqp及zmq擴充套件安裝錯誤MQ套件
- CalltoundefinedfunctionImageCreate()錯誤解決擴充套件gd庫UndefinedFunction套件
- MOSN 多協議擴充套件開發實踐協議套件
- Swift列舉,結構體,類,擴充套件,協議Swift結構體套件協議
- PHP 7.3.8 安裝 ext-Redis 擴充套件 報錯處理方案PHPRedis套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- lv擴充套件過程中遇到的錯誤套件
- 03 Windows批處理的作用域和延遲擴充套件Windows套件
- 【譯】 WebSocket 協議第九章——擴充套件(Extension)Web協議套件
- 一種MODBUS RTU擴充套件串列埠通訊協議套件串列埠協議
- 圖片處理擴充套件 Grafika 的簡單使用套件
- 表空間無法擴充套件問題處理套件
- 程式錯誤型別及其處理型別
- JMeter 擴充套件外掛實現對自定義協議的支援JMeter套件協議
- PHP錯誤處理和異常處理PHP
- chrome擴充套件推薦:無法無天的圖片內文書處理擴充套件 --- Project NapthaChrome套件ProjectAPT
- Spring 泛型處理Spring泛型
- php7安裝redis擴充套件和memcache擴充套件PHPRedis套件
- 圖片處理擴充套件 Intervention/image 的簡單使用套件
- 一個簡單的 PHP 時間處理擴充套件PHP套件
- Mysqli擴充套件庫增強—–預處理技術mysqlistmtMySql套件
- java資料型別擴充套件Java資料型別套件
- 案例研究:亞馬遜廣告使用 PyTorch 和 Amazon Inferentia 擴充套件廣告處理模型亞馬遜PyTorch套件模型
- Laravel-admin 自定義擴充套件,jQuery 語法錯誤?Laravel套件jQuery
- 螞蟻金服開源的 SOFAMesh 的通用協議擴充套件解析協議套件
- SOFAMesh中的多協議通用解決方案x-protocol介紹系列(3)——TCP協議擴充套件協議ProtocolTCP套件
- .NET 開源 EF Core 批處理擴充套件工具,真好用套件
- DoorDash使用 Kafka 和 Flink 構建可擴充套件的實時事件處理Kafka套件事件
- Go語言的表達性、錯誤處理方法和泛型等討論摘錄 - 駭客新聞Go泛型
- 乾貨丨如何水平擴充套件和垂直擴充套件DolphinDB叢集?套件
- 12c 可擴充套件的字元型別MAX_STRING_SIZE與常見錯誤套件字元型別
- 錯誤處理