Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别
2015-12-22 14:58
471 查看
Swift有许多种存储数据方式,你可以用枚举(
当你函数需要返回多个值时,元组这个时候非常有用,你可以使用下标方式来访问元组中的值,如.0,.1以此类推,如下:
如果想要给元组多增加些信息,你也可以给元组每个元素命名:
现在,你不仅可以通过
如果想给货币增加格式化,我们可以这样做:
我们的格式化方法在任何(Int,String)类型Tuple都能正常运行。
现在结构体已经有了元组相同的数据存储功能,现在我们来给他增加一个函数
如果我们想给重量
现在
现在,假如我们有个
我们可以根据需要增加
上面相当一个结构体:可以增加函数,而且区分了
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对象有相同的类型成员,但是他们的类型
Money和
Mass的是属于不同的类型。如果我们调用他们的format函数,会得到不同的结果。
枚举(Enums)
如果你想要将一些值存储在一起,我们可以根据具体情况使用tuple或者
struct,当然也可以使用
classes,但是如果遇到特殊清空,比如,有些时候我们需要在多项值中选择一个,例如,我们先看看
currencies,在之前的代码中,我们用字符串
string来做货币单位,假如只允许已知的货币在代码中出现,该怎么办? 我们可以使用
enum,假如我们只允许有euros,US dollars 和yen,我们可以建立一个
enum类型:
enum Currency { case EUR case USD case YEN }
现在,假如我们有个
Current类型的值,我们知道它是
EUR、
USDor
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,
struct,
enums。首先,优先选择
tuple如果它能胜任.如果有2个值他们有相同的结构(例如:一对String和Int),如想要体现更加类型安全、“名称化”
nominal的类型,那么应该使用
struct,例如,你想要区分
currency和
mass.最后,如果需要多个值互斥(比如EUR,USD,YEN只能选一),那么使用枚举
enums。
相关文章推荐
- AFNetwork swift版Alamofire使用问题集锦
- Swift静态属性
- swift 2
- swift 学习记录(静态方法)
- swift学习日志——输入输出参数
- Ubuntu14.04安装swift2.2
- 利用Swift之协议语法实现页面间的传值功能
- dyld: Library not loaded: @rpath/libswiftCore.dylib报错解决
- swift 学习记录(实例方法)
- 窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用
- Swift 函数(笔记)
- swift-基础08-隐式解析,隐式装包,强制装包和断言
- swift-基础07-if语句,强制解析与可选绑定和nil
- Swift 命名规则
- Swift 数据类型
- iOS --- Swift中泛型(Generic)的基本使用
- iOS集成丁香园DXY OAuth 登陆 swift代码示例
- swift中判断设备是否打开定位
- 项目开发笔记-2015.12.21-swift
- Swift Tutorial: Repeating Steps with Loops