我是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
声明?我真的不明白错误信息是什么。
答案 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()
如果convertRank
为nil
,程序不会崩溃。
更多说明:
答案 1 :(得分:0)
因为它是可选,所以在使用之前必须展开。您可以阅读 Optionals here。
let description = convertRank?.simpleDescription()
会奏效。