【问题标题】:Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?可选类型“Int?”的值未拆封;你的意思是用'!'要么 '?'?
【发布时间】:2014-09-12 16:00:08
【问题描述】:

我有以下型号:

class Word: NSManagedObject {
    @NSManaged var definitions: NSSet
}

然后,在我的一个视图控制器中,我有以下属性:

var word: Word?

但是,如果我尝试这样做:

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
{
     return self.word?.definitions.count
}

我收到一个错误:

可选类型“Int?”的值未拆封;你的意思是用'!' 还是“?”?

根据documentation,可选链调用的值也是可选的,所以.count 应该返回一个可选的Int。所以我试着打开它:

return self.word?.definitions.count!

但这仍然会导致相同的错误。这样做的正确方法是什么?

【问题讨论】:

  • 我会用return self.word?.definitions.count ?? 0之类的东西来解决这个问题

标签: swift


【解决方案1】:

问题在于操作的顺序。最干净的方法是停止可选链接(如果您真的不想处理 nil 情况)。

return self.word!.definitions.count

但为了安全起见,我建议这样做:

if let actualWord = self.word {
   return actualWord.definitions.count
}
else {
   return 0
} 

甚至更短:

return self.word ? self.word!.definitions.count : 0

否则,您不妨将 word 声明为隐式展开的可选项,而不必担心:

var word: Word!

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
{
    return self.word.definitions.count
}

【讨论】:

  • 好吧,我不能将它声明为隐式展开的可选项,因为当视图首次加载并且表重新加载时,单词可以为 nil。所以我想我必须做你的第二个建议。真的没有别的办法了吗? Objective-C 中的 1 行现在 Swift 中的 6 行:(
猜你喜欢
  • 2015-11-11
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
相关资源
最近更新 更多