2016-06-28 15 views
0

関数によって返されたオプションのオブジェクトが特定のプロトコルを実装する場合、条件付きで呼び出される関数を実装しようとしています。インタフェースを実装する条件オブジェクトとしてオプションでアンブラック

Braced block of statements is an unused closure 

Expected { after if condition 

例:

class SomeType { 
} 

class Something { 
    func doSomething() 
} 

protocol Foo { 
    func foo() -> SomeType 
} 

class Bar { 
    var whatever : SomeThing 
} 

extension Bar { 
    var handler : SomeThing? { 
     return whatever 
    } 
} 

class FooBar { 
    func doSomething(bar : Bar) { 
     // Assuming that bar's handler is set and implements Foo then use foo... 
     let foo = bar.handler as SomeThing : Foo { 
      ... 
      foo.doSomething() 
      ... 
      foo.foo() 
     } 
    } 
} 

を私はこれを行うことができます:私はそれが私に言っています...構文に苦しんだ

if let foo = bar.handler! as? Something { 
    if (foo is Foo) { 
     foo.doSomething() 
     (foo as Foo).foo() 
    } 
} 

または:

if let fubar = bar.handler! as? Something, let foo = fubar as? Foo { 
    fubar.doSomething() 
    foo.foo() 
} 

しかし、私は、実行時にすべてを決定する(それはあなたがやろうとしているまさにこのコードから非常に不明確だが、あなたは完全に動的にこれを実行しようとしている場合はきれいな方法

+0

'bar.handler as?フー '? 'Foo'が' Self'を使わず、関連する型を持っていない場合にのみ動作します。 – zneak

+0

@zneakそうではないと仮定します。 – Tibrogargan

+0

何もありませんか?関連付けられた型を持たず、Selfを使用しませんか? – zneak

答えて

0

これは最も簡単な方法です。

if let foo:Something = bar.handler! where foo is Foo { 
    foo.doSomething() 
    (foo as Foo).foo() 
} 
0

があります願っています)あなたはおそらくスウィフトと戦っているでしょう。しばしば可能ですが、毎回あなたは言語のパラダイムと戦うつもりです。

func doSomething<F: Foo>(handler : F) { ... things when F is Foo ... } 

+プロトコルクラス+ジェネリック医薬品の多くをミキシングこの方法は、しばしば偉大な痛みの原因である:これはむしろランタイムよりもコンパイル時に決定されるように、あなたは一般的に処理する方法は、何を記述しているのは過負荷でありますだから、なぜBarがクラスであり構造体ではないのか(なぜ少なくともfinal classでないのか)を慎重に尋ねるべきです。このような高度に様式化された質問の正確なアドバイスは難しいので、解決しようとしている問題についてもう少し詳しく説明しておきます。

すべてのことは、あなたが一般的に説明していることを行うことができます。あなたの構文は間違っています。あなたはどういう意味ですか:

if let foo = bar.handler as? Foo { 
+0

Rob、私は避けようとしている2つの例を示すために質問を編集しました。私は 'Something'のインスタンス化であるが、プロトコルFoo – Tibrogargan

+0

を実装する場合に限り、単一のオブジェクトを得る方法があることを期待しています。これはよくある質問です。答えはいいえだ。 SomethingとFooのメソッドをプロトコルに入れ、そのプロトコルを要求する必要があります。 –

+0

状況は、いくつかのサブクラスがプロトコルを実装するいくつかのサブクラスを持つクラス 'A'を持っています。コンテナクラスには、実際にはサブクラスのうちの1つであるタイプAのメンバー変数があります。あなたのソリューションは実用的ではありません。 – Tibrogargan

関連する問題