在Apple的快速书中,有一个枚举的例子。它允许您将原始Int转换为枚举等级。但是,当我尝试删除if语句时,代码给了我
游乐场执行失败:错误:: 30:13:错误:'排名?'没有名为' simpleDesciption'
的成员
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()
答案 0 :(得分:2)
if let
构造允许解包可选类型。 Rank.fromRaw
会返回Rank?
可选类型,这意味着它可以是nil
或类型的实际值。
有两种方法可以在Swift中解包可选类型的值,其中一种是if let
构造。如果可选类型不是if let
,则执行nil
的主体,并且if let
后面的变量绑定到其值(因此具有类型Rank
,而不是Rank?
)。
请注意,如果您只是在没有let convertedRank = Rank.fromRaw(1)
的情况下撰写if
,convertedRank
的类型为Rank?
,并且再次无法直接用作Rank
没有被打开。
如果您 确定 该值永远不会是nil
,您可以通过在!
后缀变量名来强制解包它:
let convertedRank = Rank.fromRaw(1)
convertedRank!.simpleDescription()
但这不是推荐的样式,因为如果未定义值,它将在运行时失败。