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."
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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

友情链接更多精彩内容