2016-07-20 6 views
0

私は同じことをやろうとしているループのための2つがあります。プロトコル適合チェックインforループ?

for item in components where item is UpdateableComponent 
{ 
    item.update() 
} 


for item in components 
{ 
    if let component = item as? UpdateableComponent 
    { 
     component.update() 
    } 
} 

componentsComponentオブジェクトの配列です。 UpdateableComponentは基本的に一定の間隔で特定のComponentの更新を行うプロトコルです。 Componentには、Timer、Player、Enemyなどのゲーム関連のクラスなどのサブクラスがあり、一部はUpdateableComponentプロトコルに準拠しています。

Componentにはメンバー更新がないというエラーが返されますが、それは真ですが、UpdateableComponentプロトコルでは発生します。 where句が配列をフィルタリングしないのはなぜですか? 2番目のループはコンパイルされますが、それは私に望ましい効果を与えますか?最初のものほどきれいではないし、同じ効果を達成するべきだと思う。

componentsアレイをUpdateableComponentプロトコルに準拠するオブジェクトにフィルタする有効なオプションが最初のループでないのはなぜですか?

答えて

1

これは、ItemからUpdatableComponentまでの最初のループにキャストがないためです。コンパイラは、コンポーネントタイプの項目に対してupdateを呼び出そうとしているだけで、実際にUpdateableComponentで呼び出しているという事実は考慮していません(UpdateableComponentをループフィルタはコンパイラにはありません)。 2番目のループには直接キャストがあるので、コンパイラは、componentがnilでなければ、updatableComponent型でなければならないという事実を知っています。 2番目のループでは、同じ効果が得られます。

+0

最初のループではこれは受け入れられますか? (UpdateableComponentの項目).update(dt) –

+0

はい私はそれを信じています。あなたが最初にフィルタリングしているので明示的なキャストは大丈夫です – Amloelxer

関連する問題