2017-05-24 3 views
0

iOS Share Extensionのコンテキストで、私は次の2行を見つけました: "古い"コード(古いものではありませんが、開発者がいなくなってコードを文書化してレビューしています)を見ていました。強制的なキャストは共有拡張をクラッシュさせますか?

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

最初の行:私は(私は正確にどのように、多分知らないドキュメントを赤とinputItemsがあまりにも空にすることができたので、私はこの事が起こる必要がある場合は強制キャストはアプリがクラッシュすることを想定出来た)。

2行目:上記と同じですが、最初の行にクラッシュがない場合は、別の行が存在しない可能性があります。

質問1:ループの前にinputItemsの長さを確認するのは良い考えですか?

質問2:私は、このコードに少し編集をしたし、私はこれに最初の行を変更:

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

そうした後、XCodeのは、私はあまり好きではない二行目に修正を提案します(私はそれが可読ではないと考えています):

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

は、XCodeの提案方法ですか?

コメントありがとうございます。ありがとう!

答えて

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

+0

Ok。私は2行目をよく理解していません。内容です。添付ファイルはNSItemProviderであることが保証されています(いつもあります) –

+0

docs:_(添付ファイル)画像、動画、URLなどが含まれています。これは代替のデータフォーマットやタイプの配列ではなく、ソーシャルメディアの投稿などに含めるコレクションです。これらの項目は常に入力されます。NSItemProvider_ –

+1

更新された回答を参照してください。このコードは、データにアクセスする前にすべてのオプションを安全にアンラップします。値がnilの場合、関数は実行から復帰します。 – Laffen

0

あなたが異なっているnilの値に遭遇したときスウィフトoptionalsためdocumentation

強制アンラップアプリをクラッシュします確認したい場合があります空の配列から。

質問1:いいえ、for-inループで配列の長さを考慮する必要はありません。また、コードはcontent.attachmentsではなく、inputItemsでループします。

質問2:最初の行のあなたの編集は、あなたがキャストが常に道あなたの開発者が動作することを確認することができます場合は、2番目のライン

にアンラップのいくつかの種類を必要とし、contentは、オプションの値になった原因それは大丈夫だった。あなたがもっと安全を望むなら、私はおそらくやります:

guard let content = self.extensionContext?.attachments.first as? NSExtensionItem, 
     let attachments = content.attachments as? [NSItemProvider] else 
{ 
    // fatalError() 
    return 
} 

for attachment in attachments 
{ 
    // 
} 
+0

しかし、開発者が空の配​​列をある種のものにする場合はどうなりますか? –

+0

キャストは引き続き配列型を比較しますが、for-inループは何もしません – synndicate

+0

inputType [0]は特定の型になると予想されます:inputType [0]を強制すると(配列も可能です。空)をNSExtensionItem型にすると、アプリケーションがクラッシュしませんか? –

関連する問題