可选类型'Int?'的值 没有打开; 你的意思是用'!' 要么 '?'?

Sno*_*man 13 swift

我有以下型号:

class Word: NSManagedObject {
    @NSManaged var definitions: NSSet
}
Run Code Online (Sandbox Code Playgroud)

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

var word: Word?
Run Code Online (Sandbox Code Playgroud)

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

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

我收到一个错误:

可选类型'Int?'的值 没有打开; 你的意思是用'!' 要么 '?'?

根据文档,可选链接调用的值也是可选的,因此.count应返回可选的Int.所以我尝试打开它:

return self.word?.definitions.count!
Run Code Online (Sandbox Code Playgroud)

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

dre*_*wag 18

问题是操作的顺序.最简单的方法是停止可选的链接(如果你真的不想处理零的情况).

return self.word!.definitions.count
Run Code Online (Sandbox Code Playgroud)

但我建议这样做是为了安全:

if let actualWord = self.word {
   return actualWord.definitions.count
}
else {
   return 0
} 
Run Code Online (Sandbox Code Playgroud)

甚至更短:

return self.word ? self.word!.definitions.count : 0
Run Code Online (Sandbox Code Playgroud)

否则,您也可以声明word为隐式解包的可选项,而不必担心它:

var word: Word!

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

  • 好吧,我不能将它声明为一个隐式解包的可选项,因为当视图首次加载并且表重新加载时,该单词可以为nil.所以我想我必须做你的第二个建议.真的没有别的办法吗?什么是Objective-C中的1个衬里,现在是6行与Swift :( (2认同)