Swift 示例问题

Swift issue with example

我是 swift 的新手,现在正在学习这本名为 Swift 编程语言 的书。书中有一个例子:

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 语句,但随后发生错误:Value of optional 'Rank?' not unwrapped;你是不是想用'!'或 '?'?

为什么我必须使用 if 语句?而且我真的不明白错误消息说的是什么。

因为它是可选的,您必须在使用前解包。您可以阅读有关 Optionals here.

let description = convertRank?.simpleDescription() 可以。

if let 是 Swift 中的一个特殊 structure ,它允许您检查 Optional 是否包含一个值,如果它包含 - 对未包装的值做一些事情。

你的情况:

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

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

第二种情况:

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

您可以这样解包 convertRank

let description = convertRank!.simpleDescription()

Trying to use ! to access a non-existent optional value triggers a runtime error. Always make sure that an optional contains a non-nil value before using ! to force-unwrap its value.

但下面的代码将与 if let:

相同
let description = convertRank?.simpleDescription()

如果 convertRanknil,程序将不会崩溃。


更多说明:

  • What is an optional value in Swift?
  • What does an exclamation mark mean in the Swift language?