首页 > 代码库 > Swift学习——A Swift Tour 枚举和结构体

Swift学习——A Swift Tour 枚举和结构体

Enumerations and Structures


Enumerations   枚举的使用

使用 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 = http://www.mamicode.com/ace.toRaw()
上面的例子中,定义的原始值枚举类型是Int型,只需要给第一个定义的枚举值赋初值,其他的值就会按顺序分配,你也可以使用浮点型和String类型作为枚举的原始类型

使用 toRaw 和 fromRaw 两个函数,实现原始值和枚举值之间进行切换

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

其实根据上面两个代码,不难分析,fromRaw 的功能是,在参数中提供枚举的实际值(如3),通过实际值转换成枚举的原始值

toRaw 的功能是,根据枚举的原始值(如Ace),转化成实际值,也就是Ace实际代表的值1

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()
在枚举中的描述函数,case 中的内容应该带上 . ,因为self是存在的,  .Spades 表示的是Sapdes 的枚举值

枚举还支持成员上的关联,同一个枚举的不同成员可以关联不同的值:

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)"
}


Structures  结构体的使用

使用 struct 创建结构,结构支持构造器和方法这些特性,结构和类的最大区别:结构体的实例是值传递,类的实例是引用传递

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()

下一节我们说说协议和扩展