您正在使用IE低版浏览器,为了您的IThao123账号安全和更好的产品体验,强烈建议使用更快更安全的浏览器
首页 > 周刊 > 3.5.枚举和结构

3.5.枚举和结构

2015-06-03
使用 enum 创建一个枚举。像类和所有其他的命名类型一样,枚举可以与他们相关的方法
enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescription() -> String {
        switch self {
        case .Ace:
            return "ace"
        case .Jack:
            return "jack"
        case .Queen:
            return "queen"
        case .King:
            return "king"
        default:
            return String(self.toRaw())
        }
    }
}
let ace = Rank.Ace
let aceRawValue = ace.toRaw()
练习:编写一个函数,通过比较原始值,比较他们的Rank的值

 

 

 

上面的例子表名,枚举的原始值类型是 Int ,所以需要指定第一个原始值。其余的原始值被顺序分配。字符串、 浮点数都可以作为枚举的原始值。
使用 toRaw 和 fromRaw 函数转换原始值和枚举值。

if let convertedRank = Rank.fromRaw(3) {
    let threeDescription = convertedRank.simpleDescription()
}

 

 

枚举的成员值是实际值,并不是其原始值的另一种方式。事实上,在这种情况下,如果原始值没有意义,您不需要设置。

enum Suit {
    case Spades, Hearts, Diamonds, Clubs
    func simpleDescription() -> String {
        switch self {
        case .Spades:
            return "spades"
        case .Hearts:
            return "hearts"
        case .Diamonds:
            return "diamonds"
        case .Clubs:
            return "clubs"
        }
    }
}
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()
练习:为 Suit 添加一个 color 方法,对于spades 和 clubs返回“black”,对于 hearts 和 diamonds返回“red”。

 

 

注意,Hearts成语被引用有两中方式:将值分配给 hearts 常量,枚举成员 Suit.Hearts 的全名被引用,因为常量没有一个明确的
指定类型。在 switch 中,枚举通过缩写形式.Hearts 被引用,因为 self 的值是被已知是一个Suit 。在已知变量类型的情况下可以使用缩写。

struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
练习:给 Card 添加一个方法:创建一副完整的扑克牌,并把每张牌的 rank 和 suit 对应起来。

 

 

 

一个枚举成员的实例有实例值与之对应。相同的枚举成员实例可以有不同的值。实例值和原始值是不同的:对于所有实例来说,枚举成员的原始值是一样的,在定义枚举的时候进行原始值的设置。

例如,假设从服务器获取日出和日落时间,服务器会返回正常信息或者错误信息。

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):
    let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
case let .Error(error):
    let serverResponse = "Failure...  \(error)"
}