0

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

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

第一行:我红色的文档,发现inputItems也可以是空的,所以我想如果发生这种情况,强制转换会使应用程序崩溃(我不知道到底是怎么回事,但也许它可以)。

第二行:与上面相同,不同之处在于,如果您在第一行没有崩溃,您可能不会在此处再次崩溃。

inputItems问题1:检查循环前的长度是个好主意吗?

问题 2:我对这段代码进行了一些修改,并将第一行更改为:

let content = self.extensionContext!.inputItems[0] as? NSExtensionItem

这样做之后,XCode 建议对我不太喜欢的第二行进行更正(我认为它不可读):

for attachment in (content?.attachments as? [NSItemProvider])!

XCode建议是要走的路吗?

任何评论表示赞赏。谢谢!

4

2 回答 2

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
}

资源:

声明

模式

于 2017-05-24T12:50:34.310 回答
0

您可能需要查看Swift 选项的文档

当遇到与空数组不同的 nil 值时,强制展开将使应用程序崩溃。

问题 1:不,你不必,for-in 循环考虑了数组的长度。此外,代码将循环content.attachmentsnot 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
{
    //
}
于 2017-05-24T13:03:27.160 回答