iOS Swift基础学习笔记(四)枚举(Enumeration)和结构体(Structure)

使用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.rawValue)
        }
    }
}
let ace = Rank.ace
let aceRawValue = ace.rawValue

练习:编写一个函数,通过比较原始值(raw value)来比较两个Rank的值。

func compareRank(rank1: Rank, rank2: Rank) -> Bool {
    return rank1.rawValue == rank2.rawValue
}
compareRank(rank1: Rank.ace, rank2: Rank.jack)

默认情况下,Swift 分配原始值从0开始,后面每次加1,你可以显式指定值来改变默认值。在上边的示例中,枚举的原始值(raw value)类型是Int,所以你只需要指定第一个原始值。其后的原始值都是按照顺序赋值的。你还可以使用字符串或者浮点数作为枚举的原始值。

可以使用init( rawValue: )构造器将原始值(raw value)转成枚举值(enumeration value)。

if let convertedRank = Rank.init(rawValue: 1) {
    let threeDescription = convertedRank.simpleDescription()
    
}
Rank(rawValue: 3)
Rank.init(rawValue: 50)

枚举的成员值就是实际的值,并不是原始值的另一种编写方式。实际上,当提供原始值没有实际意义的时候,你可以不提供。

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

练习:添加一个color方法到Suit,当spades和clubs是返回“black”,当hearts和diamonds时返回"red"。

    func color() -> String {
        switch self {
        case .spades, .clubs:
            return "black"
        case .hearts, .diamonds:
            return "red"
        }
    }

注意上面引用hearts成员的两种方法:当给hearts常量赋值时,枚举成员 Suit.hearts通过全名引用,因为常量没有显式声明类型。在switch中,枚举通过 .hearts引用,因为self的值是已知的。你可以在值类型已知的情况下使用这种缩写。

如果一个枚举有原始值,这些值被确定为声明的一部分,意味着每个具体的枚举实例有着一样的原始值。枚举另一个可能的选择是一个枚举成员的实例可以拥有一个和实例对应的关联值(associated value)。同一个枚举成员的实例可以有不同关联值与其对应。你在创建实例时提供关联值。关联值(associated value)和原始值(raw value)的区别:同一个枚举成员的所有实例的原始值都相同,在定义枚举时提供原始值。你可以将相关联的值视为与枚举实例的存储属性类似。例如,要从服务器请求日出和日落时间的情况。 服务器要么响应请求的信息,要么响应错误的描述信息。

enum ServerResponse {
    case result(String, String)
    case failure(String)
}

let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")

switch success {
case let .result(sunrise, sunset):
    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):
    print("Failure... \(message)")
}

练习:ServerResponseswitch加上第三种情况

enum ServerResponse {
    case result(String, String)
    case failure(String)
    case networkLost(String)
}

let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")
let networkLost = ServerResponse.networkLost("networkLost")

switch success {
case let .result(sunrise, sunset):
    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):
    print("Failure... \(message)")
case let .networkLost(networkMessage):
    print("Network... \(networkMessage)")
}

注意日出和日落的时间是如何从ServerResponse的值和switch部分匹配得到的。

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

练习:Card添加一个方法来创建一整套的纸牌,每个纸牌都是一种花色和大小的组合。

 func fullCard(spades: Int, hearts: Int, diamonds: Int, clubs: Int) -> String {
        return "The full card has \(spades) of spades, \(hearts) of hearts, \(diamonds) of diamonds and \(clubs) clubs."
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • Enumerations and Structures github:Swift基础实例github:SwiftB...
    厨子阅读 421评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 枚举为一组相关的值定义了一个共同的类型,使得可以在代码中以类型安全的方式来使用这些值。 如果熟悉 C 语言,会知道...
    穷人家的孩纸阅读 853评论 1 4
  • 沉迷吃鸡(╯°Д°)╯ 玩物丧志啊喂(╯°Д°)╯ 控制啊喂(╯‵□′)╯︵┻━┻
    西元一二阅读 248评论 0 0
  • 本周的优胜组是申佳丽组和赵海琦组 组成的第二大组。 为激发每位学生的学习潜力,调动每位学生的学习积...
    大猫_43dd阅读 649评论 0 0