我在查看“旧”代码(不是那么旧,但是一个开发人员离开了,我们正在记录和查看他的代码),这时,在iOS共享扩展的上下文中,我发现了以下两行:

let content = self.extensionContext!.inputItems[0] as! NSExtensionItem
for attachment in content.attachments as! [NSItemProvider] {

第一行:我红色了文档,发现inputItems也可以是空的,所以我想如果发生这种情况,强制转换会使应用程序崩溃(我不知道具体是怎么回事,但可能是这样的)。
第二行:和上面一样,不同的是如果你在第一行没有崩溃,你可能在这里就不会有第二行了。
问题1:在循环之前检查inputItems的长度是个好主意吗?
问题2:我对代码做了一些编辑,并将第一行改为:
let content = self.extensionContext!.inputItems[0] as? NSExtensionItem

这样做之后,XCode建议对我不太喜欢的第二行进行更正(我认为它不可读):
for attachment in (content?.attachments as? [NSItemProvider])!

XCode的建议是正确的吗?
如有任何意见,敬请谅解。谢谢!

最佳答案

在访问对象本身之前打开选项总是一个好主意。
在继续处理内容之前,可以使用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
}

资源:
Statements
Patterns

10-05 20:48
查看更多