0

在 Apple 的 swift book 中,有一个枚举示例。它允许您将原始 Int 转换为枚举等级。但是,当我尝试删除 if 语句时,代码给了我

操场执行失败:错误::30:13:错误:“排名?” 没有名为“simpleDescription”的成员

enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King

    func simpleDesciption() -> String {
        switch self {
            case .Ace:
                return "ace"
            case .Jack:
                return "jack"
            case .Queen:
                return "queen"
            case .King:
                return "king"
            default:
                return String(self.toRaw())
        }
    }
}

if let convertedRank = Rank.fromRaw(1){
    let threeDescription = convertedRank.simpleDesciption()
}

// Why does it need to be wrapped in a if statement?

let convertedRank = Rank.fromRaw(1)
let threeDescription = convertedRank.simpleDesciption()
4

1 回答 1

2

if let构造允许展开可选类型。Rank.fromRaw返回Rank?可选类型,这意味着它可以是该类型的值,也可以是nil该类型的实际值。

在 Swift 中有两种方法可以解开可选类型的值,其中一种是if let构造。if let如果可选类型不是,则执行主体,nil并且后面的变量if let绑定到它的值(因此具有类型Rank,不是Rank?)。

请注意,如果您只是let convertedRank = Rank.fromRaw(1)在没有, 的情况下编写ifconvertedRank则具有类型Rank?,并且不能直接用作 aRank而不被解包。

如果您确定该值永远不会是nil,则可以通过在变量名后加上 来强制解包它!

let convertedRank = Rank.fromRaw(1)
convertedRank!.simpleDescription()

但这不是推荐的样式,因为如果未定义该值,它将在运行时失败。

于 2014-06-08T18:03:36.053 回答