强制转换崩溃共享扩展吗?

时间:2017-05-24 12:36:56

标签: ios swift xcode casting share-extension

我正在复习" 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建议的方法吗?

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

2 个答案:

答案 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
}

资源:

Statements

Patterns

答案 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
{
    //
}