Swift快速入门之枚举与结构

来源:互联网 发布:oracle sql执行顺序 编辑:程序博客网 时间:2024/05/17 03:43

- 枚举
使用enum创建一个枚举,像类一样,枚举也可以有方法。

下面定义扑克的点数值:

enum Rank:Int{    case Ace = 1    case Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten    case Jack,Queen,King    func name()->String{        switch self {        case .Ace:            return "Ace"        case .Jack:            return "Jack"        case .Queen:            return "Queen"        case .King:            return "King"        default:            return String(self.rawValue)        }    }}let aaaa = Rank.Acelet bbbb = Rank(rawValue: 1)let cccc = aaaa.rawValueprint(aaaa.name())

此枚举的原始数据类型为Int,只需要指定枚举中首项(case)的值,后面的case的值会以依次增加的方式自动推算出来。你也可以将浮点或字符串作为枚举的原始数据类型。用rawValue属性来取得某个枚举case的原始值。使用初始化方法 init?(rawValue:)(带个“?”表示返回的结果可能是nil) 可以从一个原始值创建一个枚举实例。比如上面的bbbb。算式aaaa==bbbb的结果会是true(Swift中的Bool型的值是true和false,而不是YES和NO)。

一个枚举各case的值都是真实的值,并不是用于表示原始值的另外一种写法,如果某个case没有有意义的原始值,就不要提供它。

下面这个枚举定义了扑克的花色:

enum Suit{    case Spades,Hearts,Diamonds,Clubs    func name()->String{        switch self{        case Suit.Spades:            return "Spades"        case .Hearts:            return "Heart"        case .Diamonds:            return "Diamonds"        case .Clubs:            return "Clubs"        }    }}let hearts = Suit.Hearts

我们可以看到switch语句里,枚举项的访问可以省掉前面的类型名,这个得看情况,只有能推断出来的时候才可以省略,省略时只要一个点就可以了。

枚举的一个case实例可以带上附加的数据。同一个case的不同实例可以带着不同的附加数据。附加数据与原始数据不一样,同一个case的不同实例,它们的原始数据都一样,并且原始数据是在定义枚举时就定死了。

例如,从服务器获取日出和日落时间。服务器可以返回时间或返回错误信息,定义一个枚举:

enum ServerResponse{    case Result(String,String)    case Error(String)}let success = ServerResponse.Result("6:00 am", "8:09 pm")let failure = ServerResponse.Error("Out of cheese.")switch success{case let .Result(sunrise,sunset):    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")case let .Error(error):    print("Failuer ... \(error)")}

上面的使用方式看起来好奇怪。这个switch的执行结果是“Sunrise is at 6:00 am and sunset is at 8:09 pm”。当switch 后面是常量failure时,输出就是“Failuer … Out of cheese.” 。

case let .Result(sunrise,sunset)相当于case let ServerResponse.Result(sunrise,sunset),把ServerResponse省掉了,此处是构建一个Result case,let 使得参数sunrise和sunset从success这个case实例里获取附加数据。

- 结构

结构跟类一样,有属性有方法有构造方法。主要的区别是在赋值时结构是复制,而类是传引用,其余就是一点语法上无关紧要的小差别。比如:

struct Card {    var rank = Rank.Queen    let suit:Suit}var card = Card(rank:Rank.Ace,suit:Suit.Hearts)

上面的结构,没有为它创建构造方法。但它有默认的构造方法,类就不能这样做了。

上一篇:Swift快速入门之getter 和 setter
下一篇:Swift快速入门之协议与扩展

3 1