在Swift中声明标量值列表的最佳方法是什么?

我想知道:在 Swift中声明一个非有序的标量值列表的最佳方法是什么,它们完全由符号支持并且易于被编译器检查?

假设我想声明一个LetterSpacing值列表,我希望通过它们的符号访问和使用我的代码.

我的理解是我应该像这样声明一个快速的枚举:

enum LetterSpacing: Double {
    case Short = 1.0
    case Medium = 2.0
    case Large = 3.0
}

这工作正常,并获得编译器检查,但令人讨厌的部分是每次我需要LetterSpacing.XXX.rawValue访问基础值. .rawValue让我有点不得不在任何地方指定它.

我认为使用三个静态let short = 1.0等声明一个结构是没有意义的或者是不合适的.

那么,你会如何处理这类案件?是否有可能为现有类型添加一些协议/扩展swift魔法,以便能够将Short enum作为自己的值? (即let size = LetterSpacing.Short的类型为Double,值为1.0)

由于多种原因,枚举将是首选.

首先,枚举实际上最终会占用更少的内存.这是因为Swift将枚举值优化为单个字节(无论原始值是什么),并且当我们在枚举值调用rawValue时,我们只能从中获取完整值.将以下代码粘贴到游乐场中以查看:

struct LetterSpacingS {
    static let Short: Double = 1.0
}

enum LetterSpacingE: Double {
    case Short = 1.0
}

sizeofValue(LetterSpacingS.Short)
sizeofValue(LetterSpacingE.Short)

double是8个字节,而enum只有1个.

其次,第一点的重要性不仅限于内存占用.它也可以应用于我们程序的执行效率.如果我们想比较结构中的两个值,我们将比较8个字节.如果我们想比较两个枚举值,我们只比较一个字节.在这种特定情况下,我们有1/8的字节要比较.这只是一个双倍.考虑到Swift枚举也可以将字符串作为支持类型.比较两个字符串可能会非常昂贵,而不是只比较它们隐藏在枚举中的单个字节.

第三,使用枚举,一般来说,我们不会比较你真正不想做的浮点数.

第四,使用枚举为我们提供了一些类型安全性,我们无法使用常量结构.常量的所有结构都让我们定义了一些要使用的预定义常量.

struct LetterSpacingS {
    static let Short = 1.0
    static let Medium = 2.0
    static let Long = 3.0
}

但是现在一个方法看起来会期望其中一个值?

func setLetterSpacing(spacing: Double) {
     // do stuff
}

现在当Joe-Coder进来时会发生什么:

foo.setLetterSpacing(-27.861)

什么都没有阻止他.它需要一个双倍,任何双倍.这可能不是那么常见,但是如果这是在你正在分发的库中,那么你就会对这些问题和评论持开放态度,例如“当我传入5.0的值时,它看起来并不正确!”

但将此与使用枚举进行比较.

func setLetterSpacing(spacing: LetterSpacing) {
    // do stuff
}

而现在,我们只获得了三个预定义的选择,以便传递给这个参数.

除了内部使用enum所持有的值之外,你应该使用rawValue太多了.

第五个原因并不是在结构上使用枚举的强有力的理由,但主要是为了消除在枚举上使用结构的建议的原因之一. Swift枚举可以嵌套在其他类型中,其他类型可以嵌套在Swift枚举中.您不必使用结构来获取嵌套类型.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...