2017-11-13 20 views
0

メソッドを戻り値タイプSelfに変更する必要があります。 私はSelfを使用しています。Aのサブクラスでも動作する必要があります。この修正では、戻り値のデータを作成するためのディスパッチ同期ブロックが必要になる可能性があるため、タイプSelfのローカル変数を導入する必要があります。静的コンテキストでの自己型変数

エラー:

'Self' is only available in a protocol or as the result of a method in a class;

class A { 
    //... 
} 

class B:A { 
    //... 
} 

extension A { 
    static private func foo() -> Self { 
     var myVar: Self? //Error: 'Self' is only available in a protocol or as the result of a method in a class; 
     // Get data for myVar, potentially in a dispatch sync block on another queue 
     guard let safeVar = myVar else { 
     return someGarbagr 
     } 

     return myVar 
    } 
} 

意図している用法:

func someFunctionSomewhere() { 
    let instanceOfB = B.foo() 
    // use instanceOfB 
} 

私はすでに考えることができるすべてを試してみました:

type(of:Self) 
Self.Type 
... 

私はそれを修正避けたいですいくつかの理由から一般的な方法に変更します。あなたはクラスの機能でオブジェクトのインスタンスを返すようにしようとしている

let instanceOfB: B = B.foo() 
+0

'foo'はどこにありますか?クラス?次に、クラス名を使用します。 – Sweeper

+0

@スウィーパー私は質問に情報を追加しました。私は 'Self'を使ってサブクラスをサポートしています(これは必須です)。 – shallowThought

+0

'myVar'を使って何をしようとしているのかは少し不明ですが、やや明確な例がありますか?それにもかかわらず、「自己」は現在、ちょっと変わったタイプです。 [型推論を使うことができます](https://gist.github.com/hamishknight/f8b077cd938c418d668cdeff81b6ed2d)、 'Self?'型の変数を取得します。なぜか、let someData = queue.sync {...}のような何かをしないでください。 return self.init(someData) '? – Hamish

答えて

0

:主な理由は、我々は、一般的なバージョンは、戻り値の型を参照することができるようにするために型を明示的に言及しなければならないということです。静的メソッドは、インスタンスではなくクラス自体によって呼び出されるので、参照を返すことはできません。

しかし、グローバル変数として "myVar"を保存し、初期化するときはいつでもその変数にインスタンス参照を割り当てることができます。

返品タイプでは、返品タイプは「自己」ですか?値をチェックし、Selfインスタンスまたはnilを返します。

+0

私は分かりません。私の更新された質問を見てください、そして、あなたがまだこれが実用的な解決策であると思うなら、もっと説明してください。 – shallowThought

関連する問題