我正在复习" old"代码(不是那么老,但开发人员离开了,我们正在记录和审查他的代码),当在iOS Share Extension的上下文中,我发现了以下两行:
let content = self.extensionContext!.inputItems[0] as! NSExtensionItem
for attachment in content.attachments as! [NSItemProvider] {
第一行:我发布了文档,发现inputItems
也可能是空的,所以我认为如果发生这种事情,强迫演员会让应用程序崩溃(我不会#39) ; t确切地知道如何,但也许可以。)
第二行:与上述相同,不同之处在于,如果您在第一行没有崩溃,那么您可能在这里没有另外一个。
问题1:在循环之前检查inputItems
的长度是个好主意吗?
问题2:我对此代码进行了一些编辑,并将第一行更改为:
let content = self.extensionContext!.inputItems[0] as? NSExtensionItem
在这样做之后,XCode建议对第二行进行修正,我不太喜欢(我认为它不可读):
for attachment in (content?.attachments as? [NSItemProvider])!
是XCode建议的方法吗?
任何评论都表示赞赏。谢谢!
答案 0 :(得分:1)
在访问对象本身之前解包选项总是一个好主意。
在继续处理内容之前,您可以使用guard
来解包可选链。
guard let content = self.extensionContext?.inputItems.first as? NSExtensionItem else { return }
guard let attachments = content.attachments as? [NSItemProvider] else { return }
for attachment in attachments {
// Do stuff
}
资源:
答案 1 :(得分:0)
您可能想要查看documentation的Swift选项
当遇到与空数组不同的nil值时,强制解包会使应用程序崩溃。
问题1 :不,您不必,for-in循环会占用数组的长度。此外,代码将循环遍历content.attachments
而不是inputItems
。
问题2 :您对第一行的修改导致content
成为可选值,需要在第二行进行某种展开
如果您可以确定演员阵容将始终以您的开发人员的方式运作,那就没问题了。如果你想要更安全,我可能会这样做:
guard let content = self.extensionContext?.attachments.first as? NSExtensionItem,
let attachments = content.attachments as? [NSItemProvider] else
{
// fatalError()
return
}
for attachment in attachments
{
//
}