Swift问题的例子

时间:2015-08-31 05:05:23

标签: swift enumeration

我是swift的新手,现在正在学习这本名为 The Swift Programming Language 的书。书中有一个例子:

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

以下是我不理解的部分:

if let convertRank = Rank(rawValue: 3){
    let description = convertRank.simpleDescription()
}

我尝试将上面的代码更改为:

let convertRank = Rank(rawValue: 3)
let description = convertRank.simpleDescription()

基本上,我刚删除了if语句,但随后出现错误:可选'Rank?'的值没有打开;你的意思是用'!'或'?'?

为什么我必须使用if声明?我真的不明白错误信息是什么。

2 个答案:

答案 0 :(得分:2)

if let是Swift中的一个特殊structure,它允许您检查一个Optional是否包含一个值,如果它包含值,则使用未包装的值执行某些操作。

在你的情况下:

if let convertRank = Rank(rawValue: 3){
    let description = convertRank.simpleDescription()
}

if let结构展开Rank(rawValue: 3)(即检查是否存储了值并获取该值)并将其值存储在convertRank常量中。您可以在convertRank的第一个分支中使用if。 请注意,在if内,您不再需要使用?!

在你的第二个案例中:

let convertRank = Rank(rawValue: 3)
let description = convertRank.simpleDescription()

您可以通过这种方式展开convertRank

let description = convertRank!.simpleDescription()
  

尝试使用!来访问不存在的可选值会触发a   运行时错误。始终确保可选项包含非零值   使用!强制解包其值之前的值。

但是代码下方的代码与if let相同:

let description = convertRank?.simpleDescription()

如果convertRanknil,程序不会崩溃。

更多说明:

答案 1 :(得分:0)

因为它是可选,所以在使用之前必须展开。您可以阅读 Optionals here

let description = convertRank?.simpleDescription()会奏效。