Swift中文教程(六)--枚举和结构

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

Enumerations 枚举

使用 enum 来创建一个枚举。跟Classes(类)和其他类型的命名方式一样,枚举也可以有Method(方法)。

1enum Rank: Int {2case Ace = 13case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten4case Jack, Queen, King5func simpleDescription() ->String {6switch self {7case .Ace:8return"ace"9case .Jack:10return"jack"11case .Queen:12return"queen"13case .King:14return"king"15default:16returnString(self.toRaw())17}18}19}20let ace =Rank.Ace21let aceRawValue = ace.toRaw()

练习:

创建一个函数,通过原始值的类比来比较两个rank的值。

在上例中,原始值的类型是 Int ,所以你可以只指定第一个原始值就可以了,因为后面的原始值都是按照顺序赋值的。你还也可以使用字符串或浮点数作为枚举的原始值。

使用toRaw和fromRaw函数可以实现原始值和枚举值间的转换:

1iflet convertedRank = Rank.fromRaw(3) {2let threeDescription =convertedRank.simpleDescription()3}

枚举出来的值就是实际值,而不是其他方式写的原始值。(这句话的意思应该就是说枚举值和原始值没有必然的关联性)为了防止枚举无意义的原始值,你不需要特意提供一个原始值:

1enum Suit {2case Spades, Hearts, Diamonds, Clubs3func simpleDescription() ->String {4switch self {5case .Spades:6return"spades"7case .Hearts:8return"hearts"9case .Diamonds:10return"diamonds"11case .Clubs:12return"clubs"13}14}15}16let hearts =Suit.Hearts17let heartsDescription = hearts.simpleDescription()

练习:

给枚举Suit创建一个名为color的方法,让Spades和Clubs返回“black”,让Hearts和Diamonds返回“red”。

请注意上例中引用hearts成员的两种方式:当给常量hearts赋值时,Suit.Hearts是全名引用,因为此时的常量hearts没有一个明确的类型。而在switch内部,枚举通过缩略形式:.Hearts来引用,因为 self 的值对于枚举成员是已知的。当值的类型已知时,你可以随时使用缩略形式(去引用)。

Structures 结构

使用struct关键字创建来创建结构。结构体支持类(Classes)的许多行为:如,方法(methods)和构造器(initializers)。结构体与类最重要的区别是,在代码中,结构体通过拷贝(copy)来实现值的传递,而类则是通过引用(reference):

1struct Card {2var rank: Rank3var suit: Suit4func simpleDescription() ->String {5return"The \(rank.simpleDescription()) of \(suit.simpleDescription())"6}7}8let threeOfSpades =Card(rank: .Three, suit: .Spades)9let threeOfSpadesDescription = threeOfSpades.simpleDescription()

练习:

添加一个Card方法来创建一副纸牌,每一张牌都含有一个Rank和Suit的组合。

一个枚举成员的实例可以拥有实例的值。相同枚举成员的实例可以有不同的值。你在创建实例时可以给它指定一个值。指定值和原始值的区别在于:枚举的原始值与所有实例相同,原始值是你在定义枚举时提供的。

例如:有一个场景,需要你从服务器中请求太阳升起和降落的时间,服务器可以响应给你相应的信息,也能给你返回错误的信息:

1enum ServerResponse {2case Result(String, String)3case Error(String)4}56let success = ServerResponse.Result("6:00 am","8:09 pm")7let failure = ServerResponse.Error("Out of cheese.")89switch success {10case let .Result(sunrise, sunset):11let serverResponse ="Sunrise is at \(sunrise) and sunset is at \(sunset)."12case let .Error(error)://请求错误时返回的信息--Joe.Huang13let serverResponse ="Failure... \(error)"14}

练习:

在switch语句里给ServerResponse添加第三种情况(case)。

请注意:(上例中)ServerResponse所返回的日出与日落时间是switch中所匹配的情况(case)。

谢谢,Swifter-QQ群:362232993,同好者进~

github地址:https://github.com/Joejo/Swift-lesson-for-chinese

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航