天天快报!Swift CustomStringConvertible 协议的使用

目录一、前言二、使用场景1. 整型类型的枚举使用2. Class类型的使用一、前言

先看一下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 = .stoppedlet 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开发你需要知道的》

关键词:

为您推荐

天天快报!Swift CustomStringConvertible 协议的使用

一、前言先看一下Swift标准库中对CustomStringConvertible协议的定义publicprotocolCustomStringConvertible{ Atext

来源:博客园2023-04-22

环球今亮点!宜昌红星路小学:成立全国首家以“江豚”命名的诗社

近日,湖北省宜昌市红星路小学隆重举行“江豚诗社”成立大会。这是首家在中小学成立的以“江豚”命名的诗社。据介绍,该校首批45名小社员加入

来源:中国教育新闻网2023-04-22

每日看点!浏阳永安工业园快餐_浏阳永安工业园

1、2010年第六次人口普查数据省级行政区地级行政区县级行政区常住人口数湖南省长沙市

来源:互联网2023-04-22

环球动态:汤兰兰案:6岁女孩,被43名亲友性侵多年,亲生母亲视而不见

阅读此文前,麻烦您点击一下“关注”,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。2018年1月30日,一篇名为《寻找汤兰

来源:东方资讯2023-04-22

全球新动态:0∶0战平青岛海牛,河南队开局两连平

如果说河南队收获的1分完全靠对方外援的“慷慨馈赠”也有失公平,事实上,他们在最后时刻仍有绝杀的机会,只可惜黄紫昌的射门滑门而出,而在此

来源:正观新闻2023-04-22

今日视点:烽火通信2022年净利4.06亿同比增长40.6% 董事长曾军薪酬140万

烽火通信2022年净利4 06亿同比增长40 6%董事长曾军薪酬140万2023 4 2122:01:19挖贝网苏言挖贝网4月21日,烽火通信(6

来源:挖贝网2023-04-22

焦点热门:斯洛伐克足球超级联赛_关于斯洛伐克足球超级联赛简介

1、斯洛伐克足球超级联赛(Fortunaliga)是斯洛伐克的最高分组足球联赛。2、联赛中有12队参赛队

来源:互联网2023-04-22

世界速看:王廷科任中国人保党委书记

中央组织部有关负责同志宣布了中央决定:王廷科任中国人保党委书记。

来源:北京商报2023-04-22