Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别

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

时间: 2024-10-05 03:24:50

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

浅谈swift中的那些结构体和枚举

首先呢, 我们先写一个struct struct Point { var x = 0 var y = 1 mutating func change (newX:Int,newY: Int) { x = newX y = newY } } var p1 = Point(x: 4, y: 4) p1.x //4   在这里呢,可能有人会问,为什么在func前面要加一个mutating, 如果不加的话, 编译器抛出错误,报出不能在实例方法中修改属性值 所以呢, 我们必须如果想改变成员变量的话, 就必须

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

构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务. 构造过程是通过定义构造器(Initializers)来实现的,这些构造器可以看做是用来创建特定类型实例的特殊方法.与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化. 类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行特定的清除工作.想了解更多关于

C中多变的结构体 struct typedef

 这几天看代码,看到几种类型的结构体,结构声明如下: struct    book{ string name; int price; int num; }; 此种结构定义结构变量的格式如下: struct    book      student; struct      book{ string name; int price; int num; }student; 此种形式代表声明结构的过程和定义结构变量的过程被合并成一步 typedef    struct  (book){   //b

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

类的继承和构造过程 类里面的全部存储型属性--包含全部继承自父类的属性--都必须在构造过程中设置初始值. Swift 提供了两种类型的类构造器来确保全部类实例中存储型属性都能获得初始值,它们各自是指定构造器和便利构造器. 指定构造器和便利构造器 指定构造器是类中最基本的构造器.一个指定构造器将初始化类中提供的全部属性,并依据父类链往上调用父类的构造器来实现父类的初始化. 每个类都必须拥有至少一个指定构造器.在某些情况下,很多类通过继承了父类中的指定构造器而满足了这个条件.详细内容请參考兴许章节自

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

一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight() { //implement something } } 类示例: public class TestTime { int hours; int minutes; int seconds; public void passtime() { //implementation of behavior

Swift的结构体,枚举,可选Optional,可选链

//: Playground - noun: a place where people can play import Cocoa var str0 = "Hello, playground" //类是引用类型,结构体与枚举是值类型 //*****************结构体*************** struct Point { var x = 0 var y = 1 //结构体的的方法 //为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating mutat

51CTO C开发频道中笔记之一(结构体和枚举)

(1)结构体和枚举是C++中的构造数据类型.构造数据类型是由基本数据类型按照一定的规则组合 在一起而构成的数据类型.枚举在C/C++中,是一个被命名的整型常数的集合. 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型. (2)结构体(struct)的使用 struct test {  float a;  int b; }; 上面的代码就定义了一个名为test的结构体,它的数据类型就是test

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 = ["none","warning","error"]  //省略类型的数组声明 var menbers = [String]() //声明一个空数组 menbers.append("six")  //添加元素 menbers

修改Dictionary或List中结构体struct值的问题

问题:修改Dictionary中结构体struct值的值,如果直接用Dictionary[key].a += XX;(a为结构体中某数值型属性) ,则会报错: 无法修改.Dictionary<int,struct>.this[int]”的返回值,因为它不是变量 如果用一个变量承接Dictionary[key]中的结构体,即struct newStr =Dictionary[key],然后再做出修改:newStr.a += XX,则Dictionary中对应的结构体的值不发生变化.(由此可判断结