[置顶] Swift快速入门之枚举与结构

- 枚举
使用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.Ace
let bbbb = Rank(rawValue: 1)
let cccc = aaaa.rawValue
print(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快速入门之协议与扩展

你可能感兴趣的:(swift)