枚举和结构体 2个月前

编程语言
150
枚举和结构体

使用 enum 来创建一个枚举。就像类和其他所有命名类型一样,枚举可以包含方法。

enumRank:Int{
case ace =1
case two, three, four, five, six, seven, eight, nine, ten
case jack, queen, king
funcsimpleDescription() ->String {
switch self {
case .ace:
return"ace"
case .jack:
return"jack"
case .queen:
return"queen"
case .king:
return"king"
default:
returnString(self.rawValue)
        }
    }
}
let ace = Rank.ace
let aceRawValue = ace.rawValue

练习

写一个函数,通过比较它们的原始值来比较两个 Rank 值。

默认情况下,Swift 按照从 0 开始每次加 1 的方式为原始值进行赋值,不过你可以通过显式赋值进行改变。在上面的例子中,Ace 被显式赋值为 1,并且剩下的原始值会按照顺序赋值。你也可以使用字符串或者浮点数作为枚举的原始值。使用 rawValue 属性来访问一个枚举成员的原始值。

使用 init?(rawValue:) 初始化构造器来从原始值创建一个枚举实例。如果存在与原始值相应的枚举成员就返回该枚举成员,否则就返回 nil

iflet convertedRank =Rank(rawValue:3) {
let threeDescription = convertedRank.simpleDescription()
}

枚举值是实际值,并不是原始值的另一种表达方法。实际上,如果没有比较有意义的原始值,你就不需要提供原始值。

enumSuit {
case spades, hearts, diamonds, clubs
funcsimpleDescription() ->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() 方法,对 spadesclubs 返回 “black” ,对 heartsdiamonds 返回 “red” 。

注意在上面的例子中用了两种方式引用 hearts 枚举成员:给 hearts 常量赋值时,枚举成员 Suit.hearts 需要用全名来引用,因为常量没有显式指定类型。在 switch 里,枚举成员使用缩写 .hearts 来引用,因为 self 的值已经是一个 suit 类型。在任何已知变量类型的情况下都可以使用缩写。

如果枚举成员的实例有原始值,那么这些值是在声明的时候就已经决定了,这意味着不同枚举实例的枚举成员总会有一个相同的原始值。当然我们也可以为枚举成员设定关联值,关联值是在创建实例时决定的。这意味着同一枚举成员不同实例的关联值可以不相同。你可以把关联值想象成枚举成员实例的存储属性。例如,考虑从服务器获取日出和日落的时间的情况。服务器会返回正常结果或者错误信息。

enumServerResponse {
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 {
caselet .result(sunrise, sunset):
print("Sunrise is at \(sunrise) and sunset is at \(sunset)")
caselet .failure(message):
print("Failure...  \(message)")
}

练习

ServerResponse 和 switch 添加第三种情况。

注意 ServerResponse 的值在与 switch 的分支匹配时,日升和日落时间是如何从该值中提取出来的。

使用 struct 来创建一个结构体。结构体和类有很多相同的地方,包括方法和构造器。它们之间最大的一个区别就是结构体是传值,类是传引用。

structCard {
var rank: Rank
var suit: Suit
funcsimpleDescription() ->String {
return"The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
}
let threeOfSpades =Card(rank: .three, suit: .spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

练习

写一个方法,创建一副完整的扑克牌,这些牌是所有 rank 和 suit 的组合。

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2223521
累计阅读

热门教程文档

Spring Cloud
8小节
Dart
35小节
C#
57小节
10.x
88小节
MyBatis
19小节