Swift CustomStringConvertible 协议的使用

一、前言

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

原文链接:https://www.cnblogs.com/reyzhang/p/17340421.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Swift CustomStringConvertible 协议的使用 - Python技术站

(0)
上一篇 2023年4月19日
下一篇 2023年4月25日

相关文章

  • HBuilder包装iOS APP上App Store的详细过程

    以前看过很多教程,然后。ITUNE管理APP功能被删除,IPA安装失败。Appuploader已有1个月的期限等问题。 请参见此教程重新安装。因此,放出。 很多新生开发,不知道如何包装。ios APP安装在自己的手机测试,ios不像安卓包装好后可以直接安装到手机上,苹果APP如果需要安装在非逃避的苹果手机。需要自己申请i特定OS证书包装才能安装。   在开发…

    IOS 2023年4月18日
    00
  • [Android开发学iOS系列] TableView展现一个list

    TableView 基础 本文讲讲TableView的基本使用.顺便介绍一下delegation. TableView用来做什么 TableView用来展示一个很长的list.和Android中的RecyclerView不同, iOS中的TableView只能是竖直方向的list. 如何写一个最简单的TableView 一个最简单的TableViewCont…

    IOS 2023年4月17日
    00
  • IOS使用AutoLayout让UIScrollView自动计算ContentSize

    在IOS的界面开发中,布局方式存在分裂的两种局面。早入行的iOS开发者,基本上都是手动计算各种高度。但是从web或者Android转过去的学习iOS的开发者,基本上都很难适应这种手动计算的方式,更加偏向使用autolayout去做布局。实际上 iPhone6之后,iOS设备出现多种分辨率之后,苹果也推荐大家使用autolayout去写界面。 看了几本iOS的…

    IOS 2023年4月17日
    00
  • Xcode 工程分析

    1. 背景 Xcode作为日常开发iOS程序的IDE,支持C、C++、Objective-C、Swift、Ruby等语言进行编写。日常开发入口就是Xcode workspace或者Xcode project。 workspace是一个Xcode文档,它将项目和其他文件、project分组。一个workspace可以包含任意数量的Xcode project,以…

    IOS 2023年4月17日
    00
  • [Android开发学iOS系列] 和一个真正iOS开发的区别?

    和一个真正iOS开发的区别? 学习iOS的这段时间, 我一直在思考和感受着自己和一个真正做了几年iOS的dev之间的区别. 同时也在反向思考, 我自己和一个新学Android的人, 又有什么区别. 也许在技术转型中, 这些学习的思考和阵痛都是有共性和不可避免的.在此分享一下感受, 如果有人也有技术转型, 可以看到有些心路历程是不可避免的, 不必焦虑. 当然我…

    IOS 2023年4月17日
    00
  • 盘点| 有哪些比较新的好用的React Native 开发工具?

    2015年,FaceBook首次开发并发布React Native框架,用于构建原始的移动应用程序。React Native的特点是使用JavaScript和React编写应用程序代码,而不是其他移动应用程序开发框架,同时利用iOS和Android平台的原始组件和API,从而实现更快、更有效的开发流程。今天就来跟大家分享 React Native 中一些新的…

    IOS 2023年4月25日
    00
  • 上传了ipa但iTunes Connect没有构建版本问题

    AU上传ipa出现下图红框提示说明成功上传,如果App Store后台没有出现构建版本, 请登录 apple账号对应的邮箱查看反馈,特别留意垃圾邮箱,无论成功还是失败,apple都会发邮件 一、首先登录iTunes Connect 后台、查看ipa构建情况 https://appstoreconnect.apple.com/ 点击进入APP,点击活动,所有构…

    IOS 2023年4月18日
    00
  • iOS 审核浅谈:1.4.1、2.1、2.5.2、2.5.4、4.2.3、5.2.5

    整理下近期被 Apple 残忍虐待的成果。   ps: 可以提供一个视频链接,建议用微软的OneDrive 。审核员方便点。国内那些个地址都需要登录,需要登录才能看视频的场景,同样会被拒      Guideline 1.1 – Safety – Objectionable Content Guideline 1.1 – Safety – Objection…

    IOS 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部