尝试实施"实验"在Swift编程指南的第35页上,我在Xcode游戏中遇到了一个非常奇怪的错误。在pokerDeck
方法中,在最里面的循环中以let card...
开头的行上,我收到错误Value of optional type 'Rank?' not unwrapped
。 Rank
如何/为什么可选?
struct Card {
var rank : Rank
var suit : Suit
init(rank : Rank, suit : Suit) {
self.rank = rank
self.suit = suit
}
func pokerDeck() -> Card[] {
let suits = [Suit.Spades, Suit.Clubs, Suit.Hearts, Suit.Diamonds]
var deck = Card[]()
for suit in suits {
for r in 1 ... 13 {
let card = Card(rank: Rank.fromRaw(r), suit: suit) // ERROR
deck += card
}
}
return deck
}
}
Xcode建议的修正是添加!
let card = Card(rank: Rank.fromRaw(r)!, suit: suit)
这使问题更加模糊。
答案 0 :(得分:5)
Enum的fromRaw()
方法不知道你将传递给它的东西 - 它无法知道它是否会在每次调用时成功 - 所以他们设计的方法的返回类型为{{1 (返回类型是可选的)
Rank?
运算符(称为forced unwrapping)强制将可选项转换为枚举(如果为!
则会导致错误)
答案 1 :(得分:2)
你的问题是fromRaw返回一个可选值。如果您确定所传递的所有原始值都具有枚举值,则建议的修正是正确的。
答案 2 :(得分:2)
枚举的fromRaw()方法返回一个类型的可选项,因为不能保证每个原始值都有一个值。
答案 3 :(得分:1)
在swift中,某些函数返回可选的包装类型。在这种情况下,fromRaw()函数返回一个可选的包装枚举。
当您知道该类型将始终存在时,请使用感叹号(!)声明var。这将自动展开可选项以根据需要使用,或运行时错误(如果为nil)。