前言
本文将对阅读的国外文章进行自己的理解翻译,有哪些不对的地方还望指正。
Swift类型
Swift有三个吸引人的地方就是它的安全
,快速
,简单
。
安全意味着它很难在你编写完程序之后在运行期间出现某些错误,导致你无法捕获。并且在编写代码期间它也能够检测到代码存在的问题并加以提示,而不是等到运行程序之后有问题你才去寻找问题所在。
此外,Swift可以让你更清楚的知道代码的作用是什么,并且帮助优化你的代码。
Swift的核心在于简单和高度规范化。实现这个的关键在于Swift的类型系统:
系统由4个命名类型: protocol(协议)
, enum(枚举)
, struct(结构体)
, class(类)
以及2个组合类型:tuple(元组)
, function(函数)
组成。
可能你会觉得还有其他的基本类型:Bool, Int, UInt, Float, Double, Character, String, Array, Set, Dictionary, Optional 等等。其实他们都是建立在命名类型上并且作为Swift标准库中的一部分。
本文只针对命名类型中的enum(枚举)
, struct(结构体)
, class(类)
进行展开。
枚举
当我们需要给某些属性赋已经规定好值的时候。如果我们自己手动拼写字符串的形式,那么很容易出现拼错的情况。就比如,人类根据肤色可以分为三种:黄种人(yellow),白种人(white),黑种人(black)
假如我们使用通过手动拼写字符串的形式进行赋值时,那么可能会出现下面这种情况:
|
|
由于采用字符串的方式输入,导致我们错误的将white
写成了whit
这个时候就不能将这个人正确的分类。
这个时候枚举就起到作用了。我们使用枚举的形式将特定的类型封装好,在使用的时候,通过选择的方式,避免了输入有误的情况发生。
枚举成员的值的类型可以是字符串,字符,或是一个整型值或浮点数
|
|
关联值(Associated Values)
就比如上面的颜色例子来说,我们表示颜色的有多种形式:名称, RGB, HSL(色调(H)、饱和度(S)、亮度(L))等等。
我们如何将这些统一规范起来呢?
|
|
通过上面存储关联值的做法,我们就可以利用 ColorModel 中其中一种状态来表示颜色。这样的好处在于:
- 成员 Named 也只能用已经给定的属性进行赋值
- RGB中的UInt8取值范围在0~255,符合取值范围
通过 Protocols 协议配合 extension 扩展枚举功能
在Swift中,像enum(枚举)等命名类型都可以通过继承 Protocols 协议进行功能扩展,达到我们需要的功能。
形式一:通过继承 CustomStringConvertible 协议扩展枚举打印功能
|
|
形式二:扩展枚举初始化功能
|
|
命名空间
上述例子中,我们定义的 ColorName 枚举仅仅是为了给 ColorModel 枚举使用,没必要将 ColorName 给外部知道。所以可以将 ColorName 的定义放在 ColorModel 的扩展里面。作为其一部分即可。
|
|
Note: Swift的一个特点之一就是你不需要在使用这个命名类型之前声明它。这也是与C/C++/Objective-C的不同之处。
另外,在Swift中是没有宏定义的说法的,那么我们可以通过枚举的方式将部分数学宏封装起来。比如经常用到的 M_PI 我们通过定义枚举 Math。
|
|
结构体
值类型 vs 引用类型
未完待续…
类
未完待续…
再一次感谢您花费时间阅读这篇文章!
微博: @Danny_吕昌辉
博客: SuperDanny