Swift CustomStringConvertible 協議的使用

来源:https://www.cnblogs.com/reyzhang/archive/2023/04/21/17340421.html
-Advertisement-
Play Games

一、前言 先看一下Swift標準庫中對CustomStringConvertible協議的定義 public protocol CustomStringConvertible { /// A textual representation of this instance. /// /// Calli ...


目錄

一、前言

先看一下Swift標準庫中對CustomStringConvertible協議的定義

public protocol CustomStringConvertible {
    /// A textual representation of this instance.
    ///
    /// Calling this property directly is discouraged. Instead, convert an
    /// instance of any type to a string by using the `String(describing:)`
    /// initializer. This initializer works with any type, and uses the custom
    /// `description` property for types that conform to
    /// `CustomStringConvertible`:
    ///
    ///    struct Point: CustomStringConvertible {
    ///        let x: Int, y: Int
    ///
    ///        var description: String {
    ///            return "(\(x), \(y))"
    ///        }
    ///    }
    ///
    ///    let p = Point(x: 21, y: 30)
    ///    let s = String(describing: p)
    ///    print(s)
    ///    // Prints "(21, 30)"
    ///
    /// The conversion of `p` to a string in the assignment to `s` uses the
    /// `Point` type's `description` property.
    var description: String { get }
}

從聲明中我們可以看到協議中只包含了一個 description的只讀屬性 ,而且通過協議命名也可以窺探到它的作用 Custom+String+Convertible (所作用的類型去自定義String的轉換)

實現CustomStringConvertible協議類似於在Objective-C中重寫description方法, 可用於:

  • 自定義作用類型的print輸出
  • 作用的類型可自定義轉換成String

如標準庫中給的示例,拿出來分析一下:

struct Point: CustomStringConvertible {
    let x: Int, y: Int

    var description: String {
        return "(\(x), \(y))"
    }
}

let p = Point(x: 21, y: 30)
let s = String(describing: p)
print(s)


// Prints "(21, 30)"

上例中結構體Point 實現了CustomStringConvertible協議, 完成了description屬性的實現, 返回自定義字元串 "((x), (y))"。 接著使用String類型的 String(describing: p ) 初始化方法完成了 Point結構體轉成指定String類型格式的轉換。

通過上面的介紹,我們基本上瞭解了CustomStringConvertible協議的用法, 接下來介紹幾種使用場景。

首先要知道的是 -- 在Swift中可以實現協議的類型有 結構體枚舉。 也就是說只有結構體、 類、 枚舉等類型都可以實現CustomStringConvertible協議

二、使用場景

1. 整型類型的枚舉使用

enum AudioStatus: Int {
	case stopped = 0, playing, recording, interruptionPlaying, interruptionRecording
}

如果在使用枚舉時,除了需要訪問枚舉的整型值外,還需要可以方便的輸出每個枚舉對應的字元串類型的狀態。 那麼在這種場景下,通過extension擴展枚舉,並實現CustomStringConvertible協議將會很合適

extension AudioStatus : CustomStringConvertible {
    
    var description: String {
        switch self  {
        case .stopped:
            return "Audio: Stopped"
        case .playing:
            return "Audio: Playing"
        case .recording:
            return "Audio: Recording"
        case .interruptionPlaying:
            return "Audio: interruptionPlaying"
        case .interruptionRecording:
            return "Audio: interruptionRecording"
        }
    }
}

使用:

let status:AudioStatus = .stopped
let audioName = String(describing:status)  //取整型枚舉對應的 字元串值
print(“audioName:\(audioName)”)

2. Class類型的使用

定義一個類的話, 當我們使用print 時候並不會輸出類中的變數

class Wheel {
    var spokes: Int = 0
    var diameter: Double = 0.0
    
    init(spokes:Int = 32,diameter:Double = 26.0) {
        self.spokes = spokes
        self.diameter = diameter
    }
    
    func removeSpokes() {
        spokes = spokes > 0 ? spokes-- : spokes
    }
}

var wheel = Wheel(spokes: 36,diameter: 29)
print(wheel)
/**
 *  "Wheel\n"
 */

如果想要改變 print 的輸出結果,我們需要讓類遵守這個協議,最好用 extension擴展

extension Wheel: CustomStringConvertible {
    var description: String {
        return "wheel has \(spokes) spokes"
    }
}
var wheel = Wheel(spokes: 36,diameter: 29)
print(wheel)
/**
 *  "wheel has 36 spokes\n"
 */

如果想瞭解更多內容,可以參見專欄 《ios開發你需要知道的》

本文來自博客園,作者:reyzhang,轉載請註明原文鏈接:https://www.cnblogs.com/reyzhang/p/17340421.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ​根據2022年的DevOps全球調查報告顯示,主流軟體企業採用或部分採用DevOps且已獲得良好成效的占比已達70%,DevOps儼然成為當下軟體開發研究的重要方向。 測試作為軟體開發的必要過程,是提升軟體可靠性、保證軟體質量的關鍵環節。然而,從過往研究文獻來看,希望通過DevOps提升軟體交付效 ...
  • 在這裡分享項目中我經常使用的一種串口收發方式:阻塞發送 + 接收中斷 +空閑中斷 + 環形隊列 項目代碼地址:https://gitee.com/Mokun_gitee/stm32_hal_study.git 一、簡介 串口發送使用最簡單的阻塞發送方式,一般來說都是接收的數據量比較大,發送數據用此方 ...
  • 我學習的過程中,對於連接池和數據源分得不是很清楚,而且我發現有的人將資料庫等同於數據源,或者將數據源等同於連接池,實際上這些說法並不准確。 ...
  • 功能02-商鋪查詢緩存03 3.功能02-商鋪查詢緩存 3.6封裝redis工具類 3.6.1需求說明 基於StringRedisTemplate封裝一個工具列,滿足下列需求: 方法1:將任意Java對象序列化為json,並存儲在string類型的key中,並且可以設置TTL過期時間 方法2:將任意 ...
  • 摘要:如果你需要一款穩定可靠的高性能企業級KV資料庫,不妨試試GaussDB(for Redis)。 每當網路上爆出熱點新聞,混跡於各個社交媒體的小伙伴們全都開啟了討論模式。一條消息的產生是如何在群聊中傳遞的呢?讓我們一起來探索即時通訊系統(IM)的原理。 IM系統架構的原理 當你在群聊“相親相愛一 ...
  • 我定義了一系列靜態方法,用於執行SQL Server資料庫的增刪改查等操作。其中:ExecuteNonQuery方法用於執行指定的SQL語句並返回受影響的行數;ExecuteScalar方法用於執行指定的SQL語句並返回查詢結果的第一行第一列;ExecuteDataTable方法用於執行指定的SQL ...
  • Redis 作為一個成熟的記憶體型資料庫,對於記憶體占用和操作性能上會有自己的取捨,通過這些知識可以理解為什麼 Redis 的性能有時候會變化得那麼快。 ...
  • 一、MYSQL主從同步概述 1、什麼是MySQL主從同步? 實現數據自動同步的服務結構 主伺服器(master): 接受客戶端訪問連接 從伺服器(slave):自動同步主伺服器數據 2、主從同步原理 Maste:啟用binlog 日誌 Slave:Slave_IO: 複製master主機binlog ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...