我刚开始学习编程,我正在尝试在Swift编程书中进行实验。
它要求“”编写一个函数,通过比较它们的原始值来比较两个Rank值。“
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())
}
}
我写了以下函数
func compare(a:Rank,b:Rank) -> Bool{
return a.toRow() > b.toRow()}
我知道这是错误的,因为toRow()是Rank成员的功能。但我不知道Rank成员的数据类型是什么。
答案 0 :(得分:5)
您的代码中存在拼写错误,可能会阻止其正确编译。该方法为toRaw
而非toRow
。
你更大的问题是," Rank成员的数据类型是什么。"练习按以下方式声明Rank:enum Rank: Int
所以类型为Int。
不幸的是, Swift编程语言中的措辞很容易被忽略,但是具有原始值的成员和具有关联值的枚举的枚举声明存在细微差别(或没有价值观。)
以下是本书中原始枚举的示例:
enum ASCIIControlCharacter: Character { // note type declaration
case Tab = "\t"
case LineFeed = "\n"
case CarriageReturn = "\r"
}
键是类型声明: Character
,它遵循枚举的名称。如果您尝试将其声明为:
enum ASCIIControlCharacter { // missing type declaration
case Tab = "\t" // won't work!
case LineFeed = "\n"
case CarriageReturn = "\r"
}
您将获得error: enum case cannot have a raw value if the enum does not have a raw type
。
因此每个成员的原始值类型必须与Enum的声明类型相匹配。
答案 1 :(得分:2)
原始值是Ints。 Ace = 1,Two = 2,... King = 13.在Rank上调用的toRaw()函数返回此Int。请注意,它是toRaw()而不是toRow()。
答案 2 :(得分:0)
func compare(a: Rank , b: Rank) -> Bool {
return a.rawValue > b.rawValue
}
compare(a:two, b: ace)
答案 3 :(得分:0)
第44页,锻炼
func compare(a: Rank, b:Rank)-> Bool{
return a.rawValue > b.rawValue
}
比较(a:排名9,b:高手)
答案 4 :(得分:0)
我最终想到了这个:
func compareVals (a:Rank, b:Rank) -> String {
var result: String
if a.rawValue>b.rawValue {
result = a.simpleDescription() + " is higher than " + b.simpleDescription()
}
else {
result = b.simpleDescription() + " is higher than " + a.simpleDescription()
}
return result
}
compareVals(a:Rank.five, b:Rank.king)
答案 5 :(得分:0)
运算符重载的另一个例子
func ==(lhs: Rank, rhs: Rank) -> Bool {
return lhs.rawValue == rhs.rawValue
}
func >(lhs: Rank, rhs: Rank) -> Bool {
return lhs.rawValue > rhs.rawValue
}
let ace = Rank.ace
let two = Rank.two
ace == two // false
two > ace // true