Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举、元组、结构体之间区别,首先从最简单的开始-元组(tuples)。

元组(tuple)

元组是多个值组成的复合值类型,例如,你可以定义一个含有整形和字符串的tuple

let amout=(100,"EUR")

当你函数需要返回多个值时,元组这个时候非常有用,你可以使用下标方式来访问元组中的值,如.0,.1以此类推,如下:

let currency = money.1 // "USD"

如果想要给元组多增加些信息,你也可以给元组每个元素命名:

let money = (amount: 100, currency: "USD")

现在,你不仅可以通过.1,而且可以通过.currency访问元素值。

let currency = money.currency // "USD"

如果想给货币增加格式化,我们可以这样做:

 func format(input: (Int,String)) -> String {
return "I have \(input.0) \(input.1) in my wallet"
} println(format(money)) // This prints "I have 100 USD in my wallet"

我们的格式化方法在任何(Int,String)类型Tuple都能正常运行。

let mass = (1, "kg")

let formatted = format(mass) // "I have 1 kg in my wallet"

结构体(Struct)

事实上,“我有1kg在我的钱包”没有任何意义,因此,接下来我们介绍另外一个结构体类型,结构体(struct)不仅能够有元组类似的数据存储功能,而且能够给结构体定义函数(是元组tuple话,只能定义非成员函数来实现),让我们看看下面的结构体:

struct Money {
let amount: Int
let currency: String
} let wallet = Money(amount: 100, currency: "USD")

现在结构体已经有了元组相同的数据存储功能,现在我们来给他增加一个函数

extension Money {
func format() -> String {
return "I have \(self.amount) \(self.currency) in my wallet"
}
} println(wallet.format())

如果我们想给重量mass增加一个特有类型,我们可以这样做:

 struct Mass {
let quantity: Int
let unit: String func format() -> String {
return "I have \(self.quantity) \(self.unit) in my backpack."
}
}

现在Money类型不仅有函数,而且有明确的名称,在后面一部分代码种,我们不能像mass那样(1,'kg')传参数.结构体也叫nomial type:即明确了定义类型的名称,如果对象的类型名称相同即相同的类型,在上面的例子代码中,mass和第一次定义的wallet对象有相同的类型成员,但是他们的类型MoneyMass的是属于不同的类型。如果我们调用他们的format函数,会得到不同的结果。

枚举(Enums)

如果你想要将一些值存储在一起,我们可以根据具体情况使用tuple或者struct,当然也可以使用classes,但是如果遇到特殊清空,比如,有些时候我们需要在多项值中选择一个,例如,我们先看看currencies,在之前的代码中,我们用字符串string来做货币单位,假如只允许已知的货币在代码中出现,该怎么办? 我们可以使用enum,假如我们只允许有euros,US dollars 和yen,我们可以建立一个enum类型:

enum Currency {
case EUR
case USD
case YEN
}

现在,假如我们有个Current类型的值,我们知道它是EURUSD or YEN 其中的一种,但是现在没有办法表示成员代表其他的具体含义,或者当它同时有多个值时也没办法表示.和struct一样,枚举也能定义函数。

extension Currency {
func symbol() -> String {
switch self {
case .EUR: return "€"
case .USD: return "$"
case .YEN: return "¥"
}
}
}

我们可以根据需要增加case,当然也可以给枚举定义只有一个带实际值的成员:

enum Angle {
case Radian(radians: Double)
}

上面相当一个结构体:可以增加函数,而且区分了Angle的值与double类型值,如果有需要,我们可以给它增加更多的case(枚举成员)。

该使用哪一种呢?

现在我们总结一下怎么选择tuples,structenums。首先,优先选择tuple如果它能胜任.如果有2个值他们有相同的结构(例如:一对String和Int),如想要体现更加类型安全、“名称化”nominal的类型,那么应该使用struct,例如,你想要区分currencymass.最后,如果需要多个值互斥(比如EUR,USD,YEN只能选一),那么使用枚举enums

Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别的更多相关文章

  1. Swift 的类、结构体、枚举等的构造过程Initialization(下)

    类的继承和构造过程 类里面的全部存储型属性--包含全部继承自父类的属性--都必须在构造过程中设置初始值. Swift 提供了两种类型的类构造器来确保全部类实例中存储型属性都能获得初始值,它们各自是指定 ...

  2. 转载 C#结构体(struct)和类(class)的区别

    转载原地址: http://dotnet.9sssd.com/csbase/art/8 C#结构体和类的区别问题:在C#编程语言中,类属于引用类型的数据类型,结构体属于值类型的数据类型,这两种数据类型 ...

  3. c#中结构体(struct)和类(class)的区别

    一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...

  4. swift中的结构体和枚举

    Swift 里的结构体非常特殊. 类是面向对象编程语言中传统的结构单元.和结构体相比,Swift 的类支持实现继承,(受限的)反射,析构函数和多所有者. 既然类比结构体强大这么多,为什么还要使用结构体 ...

  5. C#中的元组(Tuple)和结构体(struct)

    在正常的函数调用中,一个函数只能返回一个类型的值,但在某些特殊情况下,我们可能需要一个方法返回多个类型的值,除了通过ref,out或者泛型集合可以实现这种需求外,今天,讲一下元组和结构体在这一方面的应 ...

  6. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  7. Swift - 复杂数据类型说明(数组,字典,结构体,枚举)

    1,数组 - Array 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 var types ...

  8. 结构体struct、联合体union、枚举类型enum

    1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...

  9. Swift语言精要 - 浅谈结构体(Struct)

    CGRect, CGSize, CGPoint这些是 . String, Int, Array, Dictionary这些我们经常用的也是结构体(Struct). 那么结构体(Struct)到底是什么 ...

随机推荐

  1. Linux系统下定时上传文件至FTP服务器脚本

    环境:Red Hat Enterprise Linux Server release 6.4 需求:需要将Oracle数据库的定时备份上传至FTP服务器 1.干货,用户名:oracle,数据库名称:X ...

  2. 删除一个表中的重复数据同时保留第一次插入那一条以及sql优化

    业务:一个表中有很多数据(id为自增主键),在这些数据中有个别数据出现了重复的数据. 目标:需要把这些重复数据删除同时保留第一次插入的那一条数据,还要保持其它的数据不受影响. 解题过程: 第一步:查出 ...

  3. Hacker(三)之黑客定位目标---IP

    IP即Internet Protocol的简称,中文简称"网协",是为计算机网络相互连接进行通信而设计的协议.无论何种操作系统,只要遵守IP协议就可以与Internet互联互通. ...

  4. C/C++ 笔试、面试题目大汇总 转

    C/C++ 笔试.面试题目大汇总 这些东西有点烦,有点无聊.如果要去C++面试就看看吧.几年前网上搜索的.刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善. 1.求下面函数的返回值( ...

  5. mysql5.7 二进制包安装

    1. 下载包 wget   http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz 2. 解 ...

  6. @@IDENTITY在加触发器时返回错误的ID值

    表ID是自增的,所以在添加时要查一下,之前是用@@IDENTITY来查,最近在加触发器时发现返回的会是在触发器中插入语句的数据ID值,上网找了下资料,发现是因为@@IDENTITY 将返回在当前会话中 ...

  7. Ribbon1: 在Office菜单中添加项目

    Office菜单就是应用程序窗口左上角的一个小的应用程序按钮,这个按钮被称作Office按钮,包含一些通用的操作或命令,例如打印.保存和发布.定制Office菜单时,其下的命令将影响整个文档,而不是文 ...

  8. PHP学习笔记七【函数】

    <?php $a=13; function abc3($a) { unset($a);//[释放给定变量]表示不在abc3函数范围内,不在使用$a,后面需要全新定义 $a=45; } abc(3 ...

  9. CentOS 7 U盘安装解决找不到U盘问题

    在使用U盘进入CentOS7系统安装选项时,按下Tab键,在屏幕下方出现:vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x ...

  10. c#中的peek()方法

    peek()方法用来判断文件是否读取完成,如果完成的话,就会有一个返回值 - 1 所以可以用streamreader的对象sr调用peek()方法来判断文件流是否读取完成 ) { Console.Wr ...